写入权限被拒绝写入一个目录,但不能写入另一个目录 - 两者都拥有相同的所有者/组/ 755

时间:2014-11-22 18:49:40

标签: php apache centos

这让我疯了。 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();我重新启动了服务器。什么......在地球上?

2 个答案:

答案 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>更改它,你就可以了。