PHP在嵌套目录中断开了相对链接


PHP broken relative links in nested directories

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

我的目录结构是这样的(暂时):

我的主站点(测试服务器上的localhost/project/,硬盘上的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文件(在'you'内部)包含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

总结一下:

是否有任何方法来确保所有的链接/路径工作正确,而不管原始路径是从哪里来的?

在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

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

至于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/" />

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