php不解析符号链接

php不解析符号链接,php,Php,php似乎没有解析符号链接 我试图将符号链接的目标添加到php文件中的include路径,但php似乎无法识别符号链接指向目录,因此无法找到要包含的文件 对于上下文,以下是相关的目录详细信息 $> pwd /var/www/siteroot $> ls -l content ... includes -> content/subdir/includes ... public_html $> ls includes/common/ default-home.php

php似乎没有解析符号链接

我试图将符号链接的目标添加到php文件中的include路径,但php似乎无法识别符号链接指向目录,因此无法找到要包含的文件

对于上下文,以下是相关的目录详细信息

$> pwd
/var/www/siteroot

$> ls -l 
content 
...
includes -> content/subdir/includes
...
public_html

$> ls includes/common/
default-home.php
这是我试图从中加载
default home.php
页面的php文件

$> cat public_html/index.php
<?php
wanted_path="../includes/common" 
set_include_path($wanted_path.PATH_SEPARATOR.get_includes_path());
var_dump(is_dir($wanted_path)); # testing to see if the included path is a directory
var_dump(is_dir("../includes")); # test to see if the symbolic link alone resolves to a directory
include "default-home.php"; 
?>
但是,
is_dir()
调用会导致False和False,错误日志显示

PHP Warning: include(default-home.php): Failed to open stream: No such file or directory 
根据我所读到的关于php的内容,比如和,似乎php通常默认解析符号链接,但也许我的配置有所不同

无论如何,如何让php定位位于符号链接下目录中的文件

我在OpenBSD5.7本机httpd服务器上使用PHP5.5.22。提前谢谢

编辑

这是一个权限问题。要显示权限和所有权,请执行以下操作:

$> ls -la
drwx-------   hilcharge daemon    ...  content
...
lrwxr------   hilcharge daemon    ... includes -> content/subdir/includes/
...
即使使用
chmod-R-L 0755 includes
更改了
includes
目标的权限,仍找不到文件夹


为了解决这个问题,我更改了
content
的权限,并且
subdir

PHP抛出了文件未找到错误,因为运行web服务器的用户没有适当的权限访问包含的文件。在这种情况下,PHP似乎不会抛出权限错误

请注意,web服务器的用户必须能够通过目标文件的绝对路径访问所需文件,因为符号链接将在加载之前解析为其正常路径

如中所述,在
is_dir($path)
中使用了相同的行为

短而不安全的解决方案

要允许包含所需的文件,请执行
chmod
以向运行Web服务器的用户授予读取权限(对于apache,通常为
www-data
,对于问题中引用的默认OpenBSD-httpd,通常为
www

比如说,

$> chmod -R -L 0755 content
# content is the root of the target of the symbolic link
将允许php访问这些文件,而不管其所有者是谁

注意
$>chmod-R-L 0755**includes**
不一定会解决此问题,因为用户可能仍然无法通过其绝对路径访问所需文件

在任何情况下,上述绝对不是所需的最低特权。有关更好、更安全的答案,请参见下文

更长、更安全的答案

参考:

web服务器用户应具有以下权限:

  • 要包含的文件的读取权限
  • 包含文件所在文件夹的读取和执行权限(绝对路径)
下面的解决方案只是如何设置文件权限的一个示例,但可能会因所需的开发人员访问权限等而有所不同

要查找运行服务器的用户,请执行以下操作:

$> ps -Aux | grep httpd
(以下假定为
www
,属于
www
的一组) 现在更改文件的组

$> chown -R :www content/
添加文件夹的读取和执行权限:

$> chmod -R 0750 content/
最后,为服务器的组仅授予对所包含文件的读取权限

$> chmod 0740 content/subdir/includes/common/default-home.php

现在,web服务器具有访问该文件所需的权限

我的案例是php fpm vhost config中的open_basedir限制问题-如下设置:

php_admin_value[open_basedir]=/website/dir:/symbolic-link-original/dir

运行web服务器的用户有权访问这些目录吗?Woops没有,谢谢。但是我刚刚做了
chmod-R-L 0755 includes
,问题仍然存在,输出没有明显变化。所有者和组也是一样的。我将输出添加到问题中,并找到了解决方案。我必须更改链接和目标之间所有目录的权限。我很惊讶php说它找不到文件,而不是说权限被拒绝。我记得不久前perl cgi文件也有类似的问题。是否有文档记录的原因?请尝试包含绝对目录:/dir/dir/includes/common。或者只需执行echo get_include_path(),以确保它的构建正确。好的,我尝试了绝对路径,它也起了作用。但是你说的正确包含是什么意思?关于绝对路径的好提示。我必须将文件从/root移动到一个更合适的位置,以便它能够读取它们。
php_admin_value[open_basedir]=/website/dir:/symbolic-link-original/dir