我很好奇PHP../
中/../
是否相同,所以我尝试了这些:
require_once('/../frame/header.php');
require_once('../frame/header.php');
他们俩都工作了。我只是幸运还是他们真的做同样的事情?为什么?
我很好奇PHP../
中/../
是否相同,所以我尝试了这些:
require_once('/../frame/header.php');
require_once('../frame/header.php');
他们俩都工作了。我只是幸运还是他们真的做同样的事情?为什么?
在您的上下文中,如果它们都有效,则意味着您的脚本位于您可以访问的文件系统的根目录中,或者位于其中的一级。但是它们并不相同! /../
指的是文件系统根目录(和..
上一个目录,它刚刚被吃掉并且仍然是根目录),而../
指的是比当前目录高一个目录。 任何以开头/
的路径都是从文件系统根目录开始的绝对路径。
从文件系统根目录以外的任何地方,它们的功能都不同。
假设您的工作目录是/var/www/scripts
.
require_once('../include.php');
将包含一个文件/var/www/include.php
。
但是从同一个位置,如果你这样做了
require_once('/../include.php');
...php 将尝试在文件/include.php
系统根目录加载文件,它可能不存在。
现在,很多网络主机都会为您提供一个文件系统,其根目录/
也是网络服务器的文档根目录,网络服务器文档根目录只是从根目录开始的一个目录级别,例如/www
. 在这种情况下,/../
可能会正常工作,但如果您尝试将其移动到具有不同文件系统配置的另一台服务器,请注意。
因此,如果脚本的工作目录是/www
,幸运的是,这两个将以相同的方式运行:
require_once('../include.php');
require_once('/../include.php');
两者都将在文件/include.php
系统根目录中包含该文件。
请注意,这不是特定于 PHP 的,而是文件系统的属性,..
通常使用...
在任何链接前面带有 / 意味着您来自所在上下文的根目录。如果您已经在根目录或 chroot 监狱中,那么这两个语句是相同的。