PHP相对路径:我可以配置吗?

时间:2015-12-14 17:21:11

标签: php apache relative-path

tl; dr:如何从当前文件的角度使PHP解释include / require语句中的相对路径?

这是关于PHP中关于相对路径的旧问题的另一个问题。请耐心等待,因为我无法找到任何我特别想要的解决方案。

考虑以下目录树和文件:

[www]:
    index.php
    config.php
    [webroot]:
        home.php

index.php需要在home.php内找到webroot

require('webroot/home.php');

home.php需要config.php,可在父目录中找到:

require('../config.php');

我的问题是,这不适用于我的本地开发环境(Ubuntu 14.04 LTS / 15.10),而它在生产中运行完美。每个提到的环境都运行Apache 2和PHP 5 奇怪的是,当我在我的Vagrant VM(Ubuntu 12.04 LTS)中运行它时,它会在本地运行,从主机访问它。但是,现在,我无法在这里运行VM。

那么,为什么这些环境表现得如此不同呢? 这让我相信必须有一种方法来改变PHP如何解释相对路径。我目前正在使用一个6GB + PHP项目,就像上面的例子一样,我真的需要避免我需要花费大量精力来重写每个include / require语句(使用dirname(__FILE__)左右),以及此可能导致的git合并冲突。

编辑:我刚才记得我其实在这里问了这个问题:PHP: include inside included file

5 个答案:

答案 0 :(得分:5)

用于解析此类相对URL的路径由the include_path configuration option配置,set_include_path具有在运行时设置它的专用函数:chdir

请注意,要搜索的路径集可能包含.,表示“当前工作目录”,可以使用getcwd设置并使用{{3}}进行读取。您可能还需要对其进行更改,以明确显示./foo.php../foo.php等相对路径。

(我建议您使用__DIR__$_SERVER['DOCUMENT_ROOT']代替,但是您提到您不想重写现有代码。我仍然建议其他人阅读此内容以明确在每个包含路径相对的位置,以避免奇怪的错误和动态基础的潜在安全漏洞。)

答案 1 :(得分:2)

如果您要覆盖现有功能,则需要安装external library或使用namespaces。两者都是额外的工作。我猜测安装一个额外的库可能甚至不是一个选项。

您可以尝试使用set_include_path添加这些文件夹的路径。

或者你可以为所有require和include重载添加一个全局变量和几个全局函数,如下所示,但你仍然需要在整个项目中查找/替换include,require,include_once,require_once的实例......并用“include_rel”替换它们......

$include_rel_path = '.';

function include_rel($path){
    global $include_rel_path;

    $my_path = $include_rel_path;

    //TODO maybe need to check for drive letters?
    if(strpos($path, '/') === 0) { //absolutepath
        $include_rel_path = preg_replace('/\/[^\/]*$/','',$path);
        include($path);
    } else { //relative path
        $include_rel_path .= preg_replace('/\/[^\/]*$/','',$path);
        include($my_path.'/'.$path);
    }
    $include_rel_path = $my_path;
}

答案 2 :(得分:1)

您必须使用auto_prepend_file。如果PHP作为Apache模块运行,则.htaccess文件到config.php文件的路径,并且访问的任何PHP文件都会自动将配置文件的内容添加到其前面。

.htaccess

php_value auto_prepend_file /full/path/to/file/config.php

如果你的服务器使用的是CGI,那么在你的php.ini中设置这个指令,或者记住,这只适用于服务器,如果PHP作为CGI运行,你需要在php.ini中添加编辑它将文件放入.user.ini文件中,而不是php_value部分。

auto_prepend_file /full/path/to/file/config.php

Nginx中,您可以将此行添加到location ~ \.php$

中的服务器配置中
fastcgi_param PHP_VALUE "auto_prepend_file=/full/path/to/file/config.php";

如果我们没有解决您的问题,请告诉我。

答案 3 :(得分:1)

<?php 
 $path = $_SERVER['DOCUMENT_ROOT'];
 $path .= "/Folder/File.php";
 include_once($path);
?>

应该这样做:)

答案 4 :(得分:-1)

的index.php:

chdir('webroot');
require_once('home.php');