PHP:open_basedir允许的路径

PHP:open_basedir允许的路径,php,open-basedir,Php,Open Basedir,我在一个页面上打了几个电话到is_dir。他们一直工作没有问题 几天前,托管公司将PHP从5.2升级到5.3。从那时起,我对is_dir的所有调用都导致以下错误(消息): 这让我困惑 显然,根据错误消息(以及php_info),目录/home/virtual/domain.com(没有尾随斜杠,因此包括子目录)包含/启用在open_basedir中,而是\u dir试图遍历的文件都位于该文件夹下的子文件夹中。那么,为什么它们不在允许的路径内呢?很明显他们是 奇怪的是,只有当is_dir返回fal

我在一个页面上打了几个电话到
is_dir
。他们一直工作没有问题

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

这让我困惑

显然,根据错误消息(以及
php_info
),目录
/home/virtual/domain.com
(没有尾随斜杠,因此包括子目录)包含/启用在
open_basedir
中,而
是\u dir
试图遍历的文件都位于该文件夹下的子文件夹中。那么,为什么它们不在允许的路径内呢?很明显他们是

奇怪的是,只有当
is_dir
返回false时,这个错误才会出现,即当文件不是文件夹,而是常规文件时。它似乎可以在没有抛出错误的情况下遍历目录

类似的问题之前在这里发布:(没有找到解决方案)

有人有什么想法吗


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

结果证明答案非常简单,但完全不合逻辑:

在创建(连接)要迭代的路径时,出于某种原因,我硬编码了一个尾随斜杠,注意上面的路径如何在
img/002.JPG/
中以斜杠结尾。删除此斜杠修复了错误。这也解释了为什么它在目录(应该有斜杠)上没有失败,而在文件上没有失败

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


所以我仍然有点困惑,为什么它没有像在PHP5.2中那样返回
FALSE
,但是,相反,这使得这个相当深奥,坦率地说是完全错误的声明,即文件不在允许的路径内……但至少现在它又能工作了。

当您打开或检查一个以现有文件为前缀、以不存在部分为后缀的路径时,会触发PHP中的未修复错误。在您的示例中,存在后缀不存在的部分
/home/virtual/domain.com/public\u html/galleries/img/002.JPG
(路径中的尾随斜杠)

有人解释说这不是一个bug:“这是预期的行为。一个不存在的非路径(带斜杠的路径)被认为在basedir之外。”,但我不这么认为。只有当路径的第一部分是现有文件时,才会触发此错误

PHP错误:


这是实际的错误消息吗?或者某些路径中有某些特殊字符?某些路径确实有一些特殊字符:
&
(与号)和
(下划线)。但是,即使对于那些不包含任何特殊字符的路径,也会出现错误(除非大写字母算作特殊字符)。特殊字符都在目录名中(并且在
is_dir
计算结果为
TRUE
的情况下被正确解析和迭代),而从不在文件名中(这就是错误发生的地方)。
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