【问题标题】:Path of current PHP script relative to document root当前 PHP 脚本相对于文档根目录的路径
【发布时间】:2014-04-14 08:38:21
【问题描述】:

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 文件的目录中。

【问题讨论】:

  • 跟进问题:所有网站都有自己的css文件吗? (我认为是这种情况)。如果是这样,为什么不在每个站点子目录中放置一个 css 目录+文件?
  • @WesH 我更新了原始问题。 :)

标签: php relative-path directory-structure document-root magic-constants


【解决方案1】:

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

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 的多站点系统吗?如果不是,那么这样布置目录结构的理由是什么?能不能说的详细一点?

【讨论】:

  • 感谢您的回答!不幸的是,这给了我绝对路径,有什么办法可以将它转换为相对于文档根目录的路径,以便我可以将该链接发送到浏览器?
  • 哦,我明白了,我误解了你在这里的要求。我会更新我的答案。
  • 谢谢,我也是。希望我正确理解了您的问题。
【解决方案2】:

看起来最好的方法是从 __DIR__ 中删除 $_SERVER['DOCUMENT_ROOT'],正如我在原始问题中提到的那样。

define('PROJECT_DIR', preg_replace('/^' . preg_quote($_SERVER['DOCUMENT_ROOT'], '/') . '/', '', __DIR__));

我想我就那样做吧。

【讨论】:

    【解决方案3】:

    我的项目根目录中有一个 config/ 文件夹,其中包含一个名为 main.php 的文件,我使用这个:

    $root = $_SERVER['DOCUMENT_ROOT'];
    $dir = dirname(__DIR__);
    $root = str_replace("\\","/",$root);
    $dir = str_replace("\\","/",$dir);
    $web_dir = str_replace($root,'',$dir);
    if ($web_dir!=='') { $web_dir = '/'.$web_dir; }
    define('DIR',$web_dir);
    

    这会从我的配置文件的完整目录路径中删除 doc 根目录,从而为我提供相对于 web 根目录的实际路径。如果您的配置文件位于项目的根目录中,您将删除此行:

    $dir = dirname(__DIR__);
    

    【讨论】:

      【解决方案4】:

      相对 URL,或者您的脚本相对于文档根目录的位置

      preg_replace('/[\\\\\\/]+/', '/', '/' . substr(__DIR__, strlen($_SERVER['DOCUMENT_ROOT'])) . '/' )
      

      【讨论】:

        猜你喜欢
        • 2011-05-27
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多