PHP破坏了嵌套目录中的相对链接

时间:2011-12-19 08:39:46

标签: php path nested relative directory

好吧,我一直在为这个看起来像现在这样的人撕掉我的头发,似乎每个答案(无论是在国内还是在国外)要么不起作用,要么措辞混乱。我对PHP比较陌生,我确信我错过了一些简单的解释,但我想确认 - 所以假设我知之甚少。

我的目录结构如此(暂时):

我的主站点(我的测试服务器上的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

直到我创建文件夹'你'一切都很好,即我将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

总结......

有没有办法确保所有链接/路径都能正常工作,无论原始路径来自哪里?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

至于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)。