过去几个月我在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错误。
答案 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)