2012-07-22 117 views
5

我有几个电话is_dir在页面上。他们一直没有问题。PHP:open_basedir允许的路径

几天前,托管公司将PHP从5.2升级到5.3。从那时起,我对is_dir所有呼叫都导致了以下错误(消息):

Warning: is_dir(): open_basedir restriction in effect. 
File(/home/virtual/domain.com/public_html/galleries/img/002.JPG/) 
is not within the allowed path(s): 
(/home/virtual/domain.com:/home/virtual/_tmp) 
in /home/virtual/domain.com/public_html/index.php on line 201 

这让我为难。

显然,根据该错误消息(和php_info以及),目录/home/virtual/domain.com(没有尾随斜线,所以包括子目录)被包括/在open_basedir启用,并且文件is_dir试图遍历全部位于该文件夹下的子文件夹中。那么为什么他们不在允许的路径之内呢?显然他们是!

奇怪的是,这个错误出现只显示当is_dir返回false,即,当文件一个文件夹,而是一个普通的文件。它似乎遍历目录没有抛出错误。

以前发布过的类似问题:Open_basedir restriction oddness(找不到解决方法)。

任何人有任何想法?

(注:更改PHP的设置是不是一种选择,因为这是一个共享的主机,我没有任何管理权限)

+0

这是否是实际的错误消息?或者某些路径中的某些特殊字符? – SteAp 2012-07-22 19:36:52

+0

有些路径确实有一些特殊字符:'&'(&符号)和'_'(下划线)。但即使对于不包含任何特殊字符的路径(除非大写字母被视为特殊字符),也会出现错误。并且特殊字符都在目录名称中(并且在'is_dir'评估为'TRUE'的情况下被正确解析和迭代),而不是在文件名称中(这是发生错误的地方)。 – 2012-07-22 21:45:34

回答

4

PHP中存在一个未定义的错误,当您打开或检查一个存在文件作为前缀且不存在的部分作为后缀的路径时,会触发该错误。在您的示例中,存在部分/home/virtual/domain.com/public_html/galleries/img/002.JPG而不存在后缀/(路径中的斜线)。

有说明这不是一个错误:“这是预期的行为。一个不存在的非路径(带有斜线的那个)被认为是在basedir之外。“,但我不这么认为。如果路径的第一部分是存在的文件,此错误只会触发。

PHP错误:

3

原来答案是超级简单,但完全不合逻辑:

当创建(连接)要遍历的路径时,我出于某种原因硬编码了一个尾部斜线 - 注意上面的路径如何以img/002.JPG/结尾,斜线在末尾。删除这个斜线修复了错误。这也解释了为什么它不会在目录(应该有斜线),只有文件(不是)。

如果指定的路径代表一个现有的目录,按照PHP文档的说法,is_dir()应返回TRUE;和FALSE在所有其他情况下,包括如果指定的文件不存在(其中img/002.JPG/不)。

所以我还是有点不解,为什么它不只是返回FALSE在PHP 5.2中使用的方式,而是让这个相当深奥并坦言只是彻头彻尾错误声明该文件是不在允许的路径内......但至少现在它再次运行。