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

标签 php relative-path directory-structure 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

(我在两个 index.php 文件中都包含了 header.phpheader.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 ,因此它会在与 index.php.
相同的目录中搜索 CSS 问题:不同目录中有多个 index.php 文件,我不想将我的 CSS 文件夹复制并粘贴到包含 index.php 文件的每个目录中。

最佳答案

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

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/');

这将进入您的根目录中的 getpath.php,并使您能够引用任何文件或目录,而不管它在目录结构中的位置(请确保在您将使用它们的任何地方包含它) .你不需要改变你的目录结构或类似的东西,你不必担心这样的东西的任何漏洞,因为它是内部的。

编辑 我不断回到系统的结构。这是一个使用相同 CSS 的多站点系统吗?如果不是,那么这样布置目录结构的理由是什么?能否提供更多细节?

关于php - 当前 PHP 脚本相对于文档根目录的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22313783/

相关文章:

php - laravel 验证使用 "numeric"规则失败,数据来自表单中的数字

php - 如何验证来自数据库的多个输入?

css - 尽管有过滤器,但 Combres 没有修复相对 URL?

xcode4 - 在Xcode 4中添加文件: ensure the path is relative to the project/how to change path?

java - 如何在java中获取目录和子目录中的所有文件的名称

PHP 路由和样式表

php - 使用两个连接加入 laravel

java - jsp web 应用程序相对路径

python - 如何设置Python包/模块目录和类定义以实现直观命名

php - Woocommerce - 更改默认值(value)税类