我很好奇../
和/../
在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
,但它可能不存在。
现在,很多Web主机会为您提供一个文件系统,其根/
也是Web服务器的文档根目录,Web服务器文档根目录与根目录只有一个目录级别,就像/www
一样。在这种情况下,/../
可能工作正常,但如果您尝试将其移动到具有不同文件系统配置的另一台服务器,请注意。
因此,如果脚本的工作目录/www
,只是运气好,这两个将以相同的方式运行:
require_once('../include.php');
require_once('/../include.php');
两者都将包括文件系统根目录下的文件/include.php
。
请注意,这不是特定于PHP的,而是通常使用该..
的文件系统的属性...
在任何链接前面加上/意味着您来自您所在上下文的根。如果您已经在根目录或 chroot jail 中,则这两个语句是相同的。