php无法解析符号链接

时间:2015-07-26 02:48:25

标签: 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"; 
?>

基于以上所述,当我转到index.php网页时,我希望看到:

bool(true) bool(true)
...(output/contents of default-home.php)

但是,is_dir()调用导致False和False,错误日志显示

PHP Warning: include(default-home.php): Failed to open stream: No such file or directory 

基于我读过的关于php的内容,例如this SO questionphp docs,似乎php通常默认解析符号链接,但是我的配置可能不同?

无论如何,我如何让PHP找到符号链接下的目录中的文件?

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

编辑

原来这是一个权限问题。要显示权限和所有权:

$> ls -la
drwx-------   hilcharge daemon    ...  content
...
lrwxr------   hilcharge daemon    ... includes -> content/subdir/includes/
...

即使使用includes更改了chmod -R -L 0755 includes目标的权限,仍然无法找到这些文件夹。

要解决问题,我更改了contentsubdir的权限。

2 个答案:

答案 0 :(得分:1)

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

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

is_dir($path)中使用了同样的行为,如php docs中所述。

简短,不安全的解决方案

要允许包含所需的文件,请执行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**不一定能解决问题,因为用户可能仍无法通过其绝对路径访问所需文件。

无论如何,以上肯定不是最低要求的特权。有关更好,更安全的答案,请参阅下文。

更长,更安全的答案

参考:Serverfault canonical answer to website file permissions with apache

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服务器具有访问该文件所需的权限。

答案 1 :(得分:1)

我的情况是php-fpm vhost配置中的open_basedir限制问题 - 设置如下:

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