php不解析符号链接
php似乎没有解析符号链接 我试图将符号链接的目标添加到php文件中的include路径,但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
$> 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