【问题标题】:is there a better way to go back to the directory root other than using $_SERVER['DOCUMENT_ROOT']?除了使用 $_SERVER['DOCUMENT_ROOT'] 之外,有没有更好的方法返回到根目录?
【发布时间】:2012-09-04 00:05:26
【问题描述】:

我正在尝试学习一种返回根目录的更好方法。我听说使用 $_SERVER 不是最安全的方法。我想知道是否有更好的方法。 所以我可以在 url example.com/exp/my.php 上得到类似的东西

这就是我得到的。

include ($_SERVER['DOCUMENT_ROOT'].'/cpages/cmain/func/init.php');
include($_SERVER['DOCUMENT_ROOT'].'/cpages/toppart.php');
include($_SERVER['DOCUMENT_ROOT'].'/cpages/boxes/image.php');
include($_SERVER['DOCUMENT_ROOT'].'/cpages/bottonpart.php');

我改成

define ('DOCUMENT_ROOT', dirname(__FILE__));
include (DOCUMENT_ROOT.'/cpages/cmain/func/init.php');
include(DOCUMENT_ROOT.'/cpages/toppart.php');
include(DOCUMENT_ROOT.'/cpages/boxes/image.php');
include(DOCUMENT_ROOT.'/cpages/bottonpart.php');

但现在它给了我一个错误

Warning: include(C:\xampp\htdocs\backbone\image/cpages/cmain/func/init.php)

($_SERVER['DOCUMENT_ROOT'] 没有告诉我错误是他们解决问题的方法吗?

【问题讨论】:

标签: php document-root


【解决方案1】:

问题是你不能依赖 $_SERVER 数组中的任何东西,因为你可能会得到各种各样的值。

所以你需要以下规则:

  1. 如果编写公共代码,请将路径放在配置文件中。然后,如果 $_SERVER 在用户的服务器上不正确,他们可以覆盖它。如果您喜欢使用一些简单的规则(见下文),您可以使用 DOCUMENT_ROOT 帮助预先完成他们的配置。

  2. 如果为自己编写的代码只会在一两台服务器之间跳转,那么假设 DOCUMENT_ROOT 是正确的,如果您移动服务器并需要,则 rwwrite 它。


如果预编译配置变量,如何提供默认的DOCUMENT_ROOT

  1. 在 Apache 上,检查 CONTEXT_DOCUMENT_ROOTDOCUMENT_ROOT 几乎总是安全的,但有几个地方可能是错误的——你提供的链接就是这种情况。如果 apache 使用 mod_alias 或 mod user_dir。在这些情况下,您需要使用更安全的CONTEXT_DOCUMENT_ROOT。但请注意,Apache 添加CONTEXT_DOCUMENT_ROOT 仅一个月左右,因此除非您安装了最新版本,否则您需要使用DOCUMENT_ROOT
  2. DOCUMENT_ROOT - 见上文
  3. 使用PATH_TRANSLATED(小于PHP_SELF 的长度)来构建到当前工作目录的路径。
  4. 使用SCRIPT_FILE_NAME(小于PHP_SELF 的长度)构建到当前工作目录的路径。
  5. 使用全局变量__DIR__到当前工作目录

然后,当您获得这些详细信息时,请检查您知道该目录中存在的文件 - 如果存在,您可能找到了正确的路径。如果没有,请尝试下一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多