是否有比使用$_SERVER[';DOCUMENT_root';]更好的方法返回到目录根目录


is there a better way to go back to the directory root other than using $_SERVER['DOCUMENT_ROOT']?

我正在努力学习返回根目录的更好方法。我听说使用$_SERVER不是最安全的方法。我想知道是否有更好的方法。所以我可以在网址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']没有告诉我错误是他们解决问题的方法吗?

问题是您不能依赖$_SERVER数组中的anthing,因为您可能会获得各种值。

因此,您需要以下规则:

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

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


如果预编译配置变量,如何提供默认的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__用于当前工作目录

然后,当你有了这些详细信息后,请检查该目录中是否存在一个你知道的文件——如果存在,那么你可能找到了正确的路径。如果没有,请尝试下一个。