这让我疯了。 httpd作为用户apache运行。我在/ var / www / html中有两个目录 - 上传和照片。两者都有组:apache的所有者:apache。两者都是755.上传可以从php写入 - 照片不是。
一些测试代码:
var_dump(touch('/var/www/html/photos/_test.log'));
var_dump(touch('/var/www/html/uploads/_test.log'));
var_dump(touch('/var/www/html/uploadsasdf/_test.log'));
结果:
Warning: touch(): Unable to create file /var/www/html/photos/_test.log because Permission denied in /var/www/html/test.php on line 2
bool(false)
bool(true)
Warning: touch(): Unable to create file /var/www/html/uploadsasdf/_test.log because Permission denied in /var/www/html/test.php on line 4
bool(false)
我已通过shell和GUI界面确认了权限。为了确定,我已经为了所有人而拥抱了一切。我已经将uploads目录重命名为其他内容,并将照片重命名为上传,以查看目录的名称是否为关键,但事实并非如此。这是目录本身。重命名的上传仍然使用新名称,现在称为“上传”的照片目录不会。
值得注意的是,测试前文件夹中不存在_test.log,因此该文件不具有错误的权限或任何内容。
有趣的是,如果我创建一个新目录,将它chown到apache:apache,chmod到777,我无法写入它,所以更大的东西可能在这里错了;但问题仍然存在:为什么上传目录会起作用?
之前有没有人见过这种行为?我错过了一些明显的东西吗?
提前感谢您的帮助!
已编辑添加更多信息:
exec('whoami')
“阿帕奇”
var_dump(posix_getpwuid(fileowner('/var/www/html/')));
var_dump(posix_getpwuid(fileowner('/var/www/html/uploads/')));
var_dump(posix_getpwuid(fileowner('/var/www/html/photos/')));
所有“apache”
所有文件都具有相同的fileperms()值。 但是,除了“上传”之外,is_writable()在所有内容中均为false。
mkdir('var/www/html/test');
警告:mkdir():权限被拒绝
ls-alF
drwxr-xr-x. 2 apache apache 286720 Nov 22 15:17 photos/
drwxr-xr-x. 2 apache apache 81920 Nov 22 12:06 uploads/
drwxr-xr-x. 2 apache apache 6 Nov 22 10:31 uploadsasdf/
我打电话给clearstatcache();我重新启动了服务器。什么......在地球上?
答案 0 :(得分:4)
由于你使用的是CentOS,并且你已经尝试了其他所有内容,我的猜测将与SELinux有关。这个问题的答案之一可能会有所帮助Forbidden You don't have permission to access on this server. Centos 6 / Laravel 4
专门尝试分析SELinux权限(ls -lZ)并暂时禁用SELinux:
如果您使用的是CentOS,那么selinux可能会出现问题。检查selinux是否启用了'sestatus'。如果启用,您可以使用'sudo setenforce 0'检查是否存在问题(暂时)。如果apache可以为站点提供服务,那么您只需要使用'sudo chcon -R -t httpd_sys_content_t'递归更改文件的上下文(您可以使用'ls -Z'检查现有的上下文。
答案 1 :(得分:1)
如果启用了selinux(sestatus
会告诉您),请先尝试sudo restorecon -Rv /var/www/
。听起来很像SELinux正在阻碍你,你不知何故有一个文件/目录没有正确标记。 Restorecon会将标签还原为默认值,-v
会显示已更正的标签(如果有)。
如果做不到这一点,我会想到扩展属性。执行lsattr <filename>
并且如果输出看起来像------i-----
,则设置不可变标志。用chattr -i <filename>
更改它,你就可以了。