我很好奇,如果../
和/../
在PHP中是相同的,那么我尝试了这些:
require_once('/../frame/header.php');
require_once('../frame/header.php');
他们都工作了。我是幸运还是他们真的做了同样的事情?为什么呢?
答案 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中,则两个语句都是相同的。