目录结构 - php 中的 /./ 和 ./ 之间有区别吗?


directory structure - Is there a difference between /../ and ../ in 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,但它可能不存在。

现在,很多Web主机会为您提供一个文件系统,其根/也是Web服务器的文档根目录,Web服务器文档根目录与根目录只有一个目录级别,就像/www一样。在这种情况下,/../可能工作正常,但如果您尝试将其移动到具有不同文件系统配置的另一台服务器,请注意。

因此,如果脚本的工作目录/www,只是运气好,这两个将以相同的方式运行:

require_once('../include.php');
require_once('/../include.php');

两者都将包括文件系统根目录下的文件/include.php

请注意,这不是特定于PHP的,而是通常使用该..的文件系统的属性...

在任何链接前面加上/意味着您来自您所在上下文的根。如果您已经在根目录或 chroot jail 中,则这两个语句是相同的。