如何跨分区使用 php readfile()?

如何跨分区使用 php readfile()?

我一直在挣扎使 PHP readfile() 正常工作。深入研究所有选项后,我发现当我尝试打开位于另一个分区的文件时,我无法让它工作。我的 webroot 文件夹位于根分区 ( /webroot) 下,我想访问位于 下的文件/home

  • 权限很好
  • open_basedir 已停用
  • 如果我将相同的文件夹和文件移动到 下的文件夹中/,那么一切都会正常,但如果它位于 下/home,那么它就不再起作用了。权限为 777,文件夹的所有者是 Apache,因此这实际上不是文件权限问题。

这是我的 fstab:

# /dev/sda1
UUID=...    /           ext4        rw,relatime,data=ordered    0 1

# /dev/sda6
UUID=...    /home       ext4        rw,relatime,data=ordered    0 2

我收到的错误是:

Warning: readfile(/home/files/1.txt): failed to open stream: Permission denied in /webroot/download.php

我在文档中没有发现任何与分区相关的限制。我的日志文件也没有显示任何特定错误。我没有安装 selinux。

编辑:open_basedir 没有错。我已经彻底检查过了。通过明确包含有问题的文件夹,以及注释掉整个 open_basedir 指令。此外,如果我确实强制执行 open_basedir 错误,那么实际的错误消息会有所不同。

当前 open_basedir 设置:

https://i.stack.imgur.com/AXe7T.png

使用 Arch Linux,PHP 5.4.13

知道这是啥吗?

答案1

我敢打赌,这个文件所在的分区一定有没有什么与您无法打开它的原因有关(只要文件系统已安装)。

权限为 777,且文件夹的所有者是 Apache,因此这实际上不是一个文件权限问题。

但是 PHP 明确地告诉你这是一个权限问题:

无法打开流:权限被拒绝

如果您已经排除了 open_basedir 和 selinux,那么还需要检查其他事项:

1) PHP 是否以 apache uid 运行?如果是 mod_php 则没问题,但对于 php-fpm 来说,这就麻烦了。

2)PHP 是否在 chroot jail 中运行?

3)您从中获得什么:

<?php

function show_p($path)
{
   print "path=" . $path . "n";
   print "permissions=" . substr(sprintf('%o', fileperms($path)), -4) . "\n";
   print_r(stat($path))
}
print "uid=" . getmyuid() . "\n";
print "gid=" . getmygid() . "\n";
show_p('/home');
show_p('/home/files');
show_p('/home/files/1.txt');
print "acl=" . `getfacl -1 /home/files/1.txt` . "\n";

相关内容