TL; DR :当尝试在PHP的include
命令中包含的页面上使用相对链接时,此页面上的最后一个代码示例有哪些替代?
我正在尝试include()
一个链接到.css
文档的文件,问题是我需要从多个(不同的)目录中包含此文件。我的目录结构看起来像这样:
www
├── (getpath.php)
│
├── css
│ └── style.css
├── php
│ └── header.php
└── content
├── index.php
└── posts
└── index.php
(我在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']);
?>
但是,我注意到这给了我用户在浏览器中请求的PHP文件的相对目录(例如content/index.php
)而不是包含的文件(getpath.php
)。我还读到PHP_SELF
基于REQUEST_URI
,这不安全。我找到了这个解决方案here:
define('PROJECT_DIR', preg_replace('/^' . preg_quote($_SERVER['DOCUMENT_ROOT'], '/') . '/', '', __DIR__));
它工作得很好,但我想知道是否有一种“更好”的方法来做到这一点。 我没有设法找到一个变量 - 上面的解决方案真的是唯一的方法吗?
我应该使用上一个代码示例还是有更好的方法?
我应该更改目录结构吗?其他人如何解决这个问题?
修改:我的网络服务器上有多个(完全独立的)网站,它们都在文档根目录的子目录中(如/documentroot/project1/
,/documentroot/project2/
,... 。)
我试图让网站在子目录中工作。我显然可以通过/css/style.css
将CSS发送到浏览器,但如果网站位于子目录中,则无效。我还想避免使用配置文件来指定项目相对于文档根目录的路径。
另一个编辑:问题是我的项目/documentroot/project1
中的每个php文件都使用PHP的include
函数包含一个导航栏。导航栏保存为/documentroot/project1/php/header.php
,导航栏的css保存为/documentroot/project1/css/style.css
。使用相对链接时(告诉浏览器style.css
在哪里),浏览器仍然认为路径是相对于index.php
而不是header.php
,因此它会在同一目录中搜索CSS作为index.php
。
问题:不同目录中有多个index.php文件,我不想复制&amp;将我的CSS文件夹粘贴到包含index.php
文件的每个目录中。
答案 0 :(得分:6)
我过去所做的就是使用这样的设置:
define('DIR_BASE', dirname( __FILE__ ).'/');
define('DIR_SYSTEM', DIR_BASE.'app/');
etc.
这将放在项目的文件根目录中,这样您就可以访问相对于根目录的文件结构的其他区域。
对于您的情况,它看起来像这样:
define('DIR_BASE', dirname( __FILE__ ).'/');
define('DIR_CSS', DIR_BASE.'css/');
define('DIR_PHP', DIR_BASE.'php/');
define('DIR_CONTENT' DIR_BASE.'content/');
这将放在你的root中的getpath.php中,并且你可以引用任何文件或目录,无论它放在目录结构中的哪个位置(确保将它包含在你将使用它们的任何地方) 。您不需要更改目录结构或类似的东西,并且您不必担心任何类似的漏洞,因为它是内部的。
修改强> 我一直回到系统的结构。这是一个使用相同CSS的多站点系统吗?如果没有,那么将目录结构如此布局的理由是什么?你能再详细介绍一下吗?
答案 1 :(得分:2)
最好的方法是从$_SERVER['DOCUMENT_ROOT']
中移除__DIR__
,正如我在原始问题中提到的那样。
define('PROJECT_DIR', preg_replace('/^' . preg_quote($_SERVER['DOCUMENT_ROOT'], '/') . '/', '', __DIR__));
我想我会这样做。
答案 2 :(得分:0)
相对URL,或脚本相对于文档根目录的位置
preg_replace('/[\\\\\\/]+/', '/', '/' . substr(__DIR__, strlen($_SERVER['DOCUMENT_ROOT'])) . '/' )