在open_basedir限制下使用PHP的$ _SERVER [“DOCUMENT_ROOT”]

时间:2013-11-01 03:47:59

标签: php document-root

过去几个月我在localhost上建立了一个网站。在整个站点中,我使用$_SERVER["DOCUMENT_ROOT"]来访问服务器的根目录,而不是使用相对路径,因此我可以从那里引用文件。但是,我刚决定将我的网站上传到000webhost。我很快发现,对于那些使用它们的人,您可能知道,他们的服务器根目录与您上传文件的实际目录不同。我相信它是虚拟主机......无论如何,我的$_SERVER["DOCUMENT_ROOT"]现在在网站上引发了错误:

  

警告:include_once()[function.include-once]:open_basedir限制生效。文件(/ usr / local / apache / htdocs / mypath)不在允许的路径中

我看过的每个其他网站都说你应该将$_SERVER["DOCUMENT_ROOT"]替换为000webhost提供给你的主目录。但是,如果我想在将来更改托管服务,我就搞砸了。有没有办法使用$_SERVER访问设置的虚拟目录或使用htaccess或其他东西来使我的代码工作?我尝试在我的根目录中的htaccess文件中使用DocumentRoot,但在尝试访问该页面时出现了404错误。

2 个答案:

答案 0 :(得分:4)

我绝不会建议使用DOCUMENT_ROOT。例如,如果您想通过命令行或cron运行脚本,则无用。

我想通过你的一个脚本设置include_path。每个页面都包含的内容(如某种配置或引导脚本)。

例如,假设您的应用根目录中有config.php(可能是doc root但不重要),每个页面都包含

set_include_path(implode(PATH_SEPARATOR, array(
    __DIR__, // this is the directory of this file, config.php
    get_include_path()
)));

然后,您可以在include / require对帐单中安全地使用此位置的相对路径

include 'foo.php';         // APP_ROOT/foo.php
include 'somedir/bar.php'; // APP_ROOT/somedir/bar.php

设置包含路径时,脚本所在的位置并不重要,只需构造适当的路径即可。假设config.php住在APP_ROOT/configs/config.php,包含路径将是

realpath(__DIR__ . '/..') // realpath just resolves the path traversal

答案 1 :(得分:-1)

相关问题