我一直在挣扎使 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";