1

我很好奇PHP..//../是否相同,所以我尝试了这些:

require_once('/../frame/header.php');
require_once('../frame/header.php');

他们俩都工作了。我只是幸运还是他们真的做同样的事情?为什么?

4

2 回答 2

11

在您的上下文中,如果它们都有效,则意味着您的脚本位于您可以访问的文件系统的根目录中,或者位于其中的一级。但是它们并不相同! /../指的是文件系统根目录(和..上一个目录,它刚刚被吃掉并且仍然是根目录),而../指的是比当前目录高一个目录。 任何以开头/的路径都是从文件系统根目录开始的绝对路径。

从文件系统根目录以外的任何地方,它们的功能都不同。

假设您的工作目录是/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 的,而是文件系统的属性,..通常使用...

于 2013-01-29T16:39:41.853 回答
1

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

于 2013-01-29T16:40:32.183 回答