【问题标题】:php not resolving symbolic linkphp没有解析符号链接
【发布时间】:2017-03-09 20:26:26
【问题描述】:

php 似乎没有解析符号链接。

我正在尝试将符号链接的目标添加到 php 文件中的包含路径,但 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 的权限。

【问题讨论】:

  • 运行 Web 服务器的用户是否有权访问这些目录?
  • 糟糕,他们没有,谢谢。但我刚刚做了chmod -R -L 0755 includes,问题仍然存在,输出没有明显变化。所有者和组也是一样的。
  • 我将输出添加到问题中,并找到了解决方案。我不得不更改链接和目标之间所有目录的权限。我很惊讶 php 说它找不到文件,而不是说权限被拒绝。我记得不久前 perl cgi 文件也有类似的问题。是否有一些记录在案的原因?
  • 尝试包含一个绝对目录:/dir/dir/includes/common。或者只是执行 echo get_include_path() 以确保它正确构建。
  • 好的,我尝试了绝对路径,它也有效。但是,正确包含是什么意思?

标签: php


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    简短、不安全的解决方案

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

    例如,

    $> chmod -R -L 0755 content
    # content is the root of the target of the symbolic link
    

    将允许 php 访问文件,无论所有者是谁

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

    无论如何,以上当然不是最低要求的特权。如需更好、更安全的答案,请参见下文。

    更长、更安全的答案

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

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

    • 所包含文件的读取权限
    • 包含文件所在文件夹的读取和执行权限(绝对路径)

    以下解决方案只是如何设置文件权限的一个示例,但可能会因所需的开发人员访问权限等而有所不同。

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

    $> ps -Aux | grep httpd
    

    (以下假设为www,属于www的一组) 现在更改文件的组

    $> chown -R :www content/
    

    为文件夹添加读取和执行权限:

    $> chmod -R 0750 content/
    

    最后赋予服务器组对所包含文件的只读权限

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

    现在,网络服务器拥有访问文件所需的权限。

    【讨论】:

    • 关于绝对路径的好提示。我不得不将我的文件从 /root 移动到更合适的位置,以便它可以读取它们。
    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多