【问题标题】:PHP broken relative links in nested directoriesPHP在嵌套目录中破坏了相对链接
【发布时间】:2012-01-23 10:27:11
【问题描述】:

我确定我遗漏了一些简单的解释,但我想确认一下 - 所以假设我知道的很少。

我有一个这样的目录结构(暂时):

我的主站点(我的测试服务器上的 localhost/project/ 和我的 HDD 上的 C:/xampp/htdocs/project)包含这些文件和文件夹:

Root
  graphics
    variousgraphics.png

  support
    stylesheet.css


  templates
    header.php
    footer.php
    initialize.php

  you
    default.php

  index.php
  anotherfile.php

在我创建文件夹“you”之前一切都很好,即我将 index.php 的初始化文件包含为 <?php include(templates/initialize.php) ?>

但是当我决定使用上述方法为 default.php 文件(在“你”内)包含 initialize.php 时,它会出错Warning: include(templates/initialize.php) [function.include]: failed to open stream: No such file or directory in C:\xampp\htdocs\photoquilt\you\default.php

所以我很自然地附加了../ 来创建<?php include(../templates/initialize.php) ?>,但是这当然不起作用,因为initialize.php 中引用的文件没有以相同的方式附加,所以我到了这里。

对我来说值得注意的是,$_SERVER['document_root'] 的回显会导致 C:/xampp/htdocs

总之:

有什么方法可以确保所有链接/路径都能正常工作,而不管原始路径来自哪里?

【问题讨论】:

    标签: php directory path nested relative-path


    【解决方案1】:

    在default.php中你可以定义一个常量

    define('ROOT_PATH', dirname(__DIR__));
    

    或对于 5.3.0 之前的 php 版本

    define('ROOT_PATH', dirname(dirname(__FILE__)));
    

    然后在所有脚本中使用ROOT_PATH 来构建文件路径。


    - http://docs.php.net/language.constants.predefined
    - http://docs.php.net/dirname

    【讨论】:

    • 对不起,但这对我来说似乎根本不起作用。如果在 you/default.php 中输入define('ROOT_PATH', basename(__DIR__));,然后输入include(ROOT_PATH.'/templates/initialize.php'),我会得到与我在OP 中提到的相同的错误,除了现在它只是说Warning: include(you/templates/initialize.php) [function.include]: failed to open stream: No such file or directory in C:\xampp\htdocs\photoquilt\you\default.php?
    • 哎呀,那是因为我是个白痴 ;-) basename->dirname,查看更新版本的答案...
    • 完美!它确实有效,但我不得不稍微更改我的一些链接(显然),所以,但这与使用绝对链接有什么不同,我们本质上不是在文件名的前面部分连接然后输入其余的手动输出?谢谢,点赞!
    • 是的,您现在正在使用绝对路径...或多或少。当您使用相对路径时,它们对当前工作目录是真实的。现在您的路径与 ROOT_PATH 是“相对”的。
    【解决方案2】:

    据我所知,这里有几个问题:服务器端和客户端。

    至于 PHP,你做得很好。通过文件的相对路径 (../templates/initialize.php) 引用文件是可行的方法。还有另一种实现相同的方法,尽管我不推荐它:编辑 include_path 以添加项目的根目录。您可以在位于根目录的.htaccess 中执行此操作,即:

    php_value include_path ".:/path/to/your/project:/usr/local/lib/php"
    

    对于 HTML 部分(图片未加载,样式表未找到),您可以设置基本 href:

    <base href="http://path.to.your/in-server/" />
    

    基本的 href 应该指向你目录的根目录。然后必须将 HTML 中的所有图像、样式表等固定为使用项目根目录中的相对 URI (graphics/variousgraphics.png)。

    【讨论】:

    • 是的,但是引用../templates/initialize.php 只会将问题转移到initialize.php,因为其中的引用文件没有以相同的方式附加。
    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 2017-10-22
    • 1970-01-01
    • 2020-11-17
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多