当前PHP脚本相对于文档根目录的路径

Aba*_*unt 9 php directory-structure relative-path document-root magic-constants

TL; DR:当尝试在PHP include命令包含的页面上使用相对链接时,此页面上的最后一个代码示例有哪些替代方案?


我正在尝试include()链接到.css文档的文件,问题是我需要从多个(不同的)目录中包含此文件.我的目录结构看起来有点像这样:

www
??? (getpath.php)
?
??? css
?   ??? style.css
??? php
?   ??? header.php
??? content
    ??? index.php
    ??? posts
        ??? index.php
Run Code Online (Sandbox Code Playgroud)

(我header.php在两个index.php文件中都包含.header.php是引用的文件style.css(浏览器需要找到的文件).例如:使用时../css/style.css,CSS会显示在我的content/index.php但不会显示在我的文件中content/posts/index.php,因为浏览器正在寻找content/css/index.php.)

放置在文档根目录的子目录中时,网站也应该工作,而不是在文档根目录中.出于这个原因,我不能只使用/css/style.css(相对于服务器根目录)链接到我的CSS样式表.

我想(请纠正我,如果我错了!)告诉浏览器在哪里找到CSS文档的最简单方法可能是指定相对于文档根目录的路径.由于我希望我的网站位于文档根目录的子目录中(并且希望避免使用config文件来存储子目录),我需要找出网站所在子目录的相对路径.我的想法是放置getpath.php在我的网站的根目录(不是文档根目录)中调用的文件.在该文件中,我写了以下内容:

<?php
  define('PROJECT_SUBDIRECTORY', $_SERVER['PHP_SELF']);
?>
Run Code Online (Sandbox Code Playgroud)

但是,我注意到这给了我用户在浏览器中请求的PHP文件的相对目录(例如content/index.php)而不是包含的文件(getpath.php).我也读过这PHP_SELF是基于REQUEST_URI,这是不安全的.我在这里找到了这个解决方案:

define('PROJECT_DIR', preg_replace('/^' . preg_quote($_SERVER['DOCUMENT_ROOT'], '/') . '/', '', __DIR__));
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但我想知道是否有一个"更好"的方法来做到这一点.我没有设法找到一个变量 - 上面的解决方案真的是唯一的方法吗?

我应该使用前面的代码示例还是有更好的方法?
我应该更改目录结构吗?其他人如何解决这个问题?


编辑:我有我的网络服务器多(完全独立的)的网站,他们都在文档根目录的子目录(如/documentroot/project1/,/documentroot/project2/...)
我试图让网站在子目录工作.我显然可以通过CSS将CSS发送到浏览器/css/style.css,但如果网站位于子目录中,则无效.我还想避免使用配置文件来指定项目相对于文档根目录的路径.


另一个编辑:问题是我的项目中的每个php文件都/documentroot/project1包含一个使用PHP include函数的导航栏.导航栏保存为/documentroot/project1/php/header.php和导航栏的css一样/documentroot/project1/css/style.css.当使用相对链接(告诉浏览器在哪里style.css)时,浏览器仍然认为路径是相对的index.php而不是header.php,因此它在同一目录中搜索CSS index.php.
问题:不同目录中有多个index.php文件,我不想将CSS文件夹复制并粘贴到包含文件的每个目录中index.php.

Wes*_*s H 6

我过去所做的就是使用这样的设置:

define('DIR_BASE',     dirname( __FILE__ ).'/'); 
define('DIR_SYSTEM',   DIR_BASE.'app/');
etc.
Run Code Online (Sandbox Code Playgroud)

这将放置在项目的文件根目录中,这将使您可以访问相对于根目录的文件结构的其他区域.

对于您的情况,它看起来像这样:

define('DIR_BASE',     dirname( __FILE__ ).'/');
define('DIR_CSS',      DIR_BASE.'css/');
define('DIR_PHP',      DIR_BASE.'php/');
define('DIR_CONTENT'   DIR_BASE.'content/');
Run Code Online (Sandbox Code Playgroud)

这将放在你的root中的getpath.php中,并且你可以引用任何文件或目录,无论它放在目录结构中的哪个位置(确保在你将要使用它们的任何地方包含它).您不需要更改目录结构或类似的东西,并且您不必担心任何类似的漏洞,因为它是内部的.

编辑 我一直回到系统的结构.这是一个使用相同CSS的多站点系统吗?如果没有,那么将目录结构如此布局的理由是什么?你能再说一点细节吗?