【问题标题】:Using PHP's $_SERVER["DOCUMENT_ROOT"] under an open_basedir restriction在 open_basedir 限制下使用 PHP 的 $_SERVER["DOCUMENT_ROOT"]
【发布时间】:2013-11-01 03:47:59
【问题描述】:

过去几个月我一直在 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 错误。

【问题讨论】:

    标签: php document-root


    【解决方案1】:

    我绝不会推荐使用DOCUMENT_ROOT。例如,如果您想通过命令行或 cron 运行脚本,它是没有用的。

    我会改为通过您的脚本之一设置include_path。每个页面中都包含的内容(例如某种配置或引导脚本)。

    例如,假设您在应用的根目录中有config.php(可以是文档根目录,但这并不重要),它包含在每个页面中

    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
    

    【讨论】:

    • @Nickersoft I've spent the past few months building a website on localhost:这意味着网站在主机切换之前没有完全活跃,这反过来意味着你有时间实施这个解决方案。在退潮的时候做,而不是等到有客户的时候再感到绝望。
    • 哈哈我还没有客户...我只是希望尽快推出而已。
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 2013-08-12
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多