php中的/../和../之间有区别吗?

时间:2013-01-29 16:37:46

标签: php directory-structure

我很好奇,如果..//../在PHP中是相同的,那么我尝试了这些:

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

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

2 个答案:

答案 0 :(得分:11)

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

从文件系统根目录以外的任何地方,这些都不会等效。

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

答案 1 :(得分:1)

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