【问题标题】:PHP - readfile() failed to open stream: Permission denied - but why?PHP - readfile() 无法打开流:权限被拒绝 - 但为什么?
【发布时间】:2017-10-25 12:06:05
【问题描述】:

我有 Ubuntu 16.04,上面有 Apache2 和 php7。 我不想用 php 读取一些日志文件并打印它们。 所以我做一个简单的

readfile("/var/log/apache2/access.log");

但这不起作用。我收到此错误:

Warning: readfile(/var/log/apache2/access.log): failed to open stream: Permission denied in /var/www/test.php on line 2

我很确定我已经设置了正确的权限,Apache 和 php 作为 www-data 运行,所以我将用户 www-data 添加到组“adm”和“syslog”,因为这些组具有读取权限对于整个文件路径和文件本身。 权限默认为 640,但仅当我将其设置为 647 时,该文件才可用于 php/apache。即使 644 或 646 也不够。

这是为什么呢?我是否必须更改 Apache vhost 配置中的某些内容?

补充:ls -alp /var/log/apache2

drw-r----- 2 root adm     4096 Oct 25 11:07 ./
drwxr-xr-x 9 root syslog  4096 Oct 25 10:39 ../
-rw-r----- 1 root adm    47861 Oct 25 14:01 access.log
-rw-r----- 1 root adm    12014 Oct 25 14:01 error.log
-rw-r----- 1 root adm        0 Oct 25 10:40 other_vhosts_access.log

【问题讨论】:

  • 请将此添加到问题中:cd /var/log/apache2; ls -alp
  • @Tenbo:他已经说过647没问题。看起来他需要 o=rwx 来读取他的文件,这很奇怪。这就是为什么我让他在 /var/log/apache2 上发布 ls -alp。
  • @Nic 已添加到我的起始帖子中

标签: php permissions readfile


【解决方案1】:

由于这显然是一个权限错误,请确保每个指向 access.log 的父文件夹都将组设置为 adm 或 syslog。

每个指向 access.log 的文件夹必须至少有一个组读取权限和执行 (g+rx) 以允许 PHP 进入每个子目录。


如果我是您,我会更改 apache 配置以将文件写入您的 Web 根目录中的一个公共不可访问的文件夹(因为日志文件在您的应用程序中显然是必不可少的)。这样可以避免修改系统文件夹权限,这在 Web 应用程序中尤其危险。

【讨论】:

  • 谢谢!一个文件夹对该组没有执行权限。
猜你喜欢
  • 2014-10-28
  • 2015-11-15
  • 1970-01-01
  • 2010-11-14
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多