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 question和php 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
目标的权限,仍然无法找到这些文件夹。
要解决问题,我更改了content
和subdir
的权限。
答案 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