为什么file_put_contents在从浏览器运行时会出现权限问题?

时间:2013-11-29 10:31:37

标签: php linux apache permissions

这个问题在这里被问过几次,但我还没有找到解决方案。我有一个Fedora 19 LAMP服务器,我只想运行简单的命令:file_put_contents('test.txt', 'Hello there');,以确认我的Web服务器可以使用PHP将数据写入文件。我在找出合适的权限方案时遇到了麻烦。首先,Apache的文档根目录为/var/www/html。此目录最初由名为www-data的用户和组拥有,但我将目录的组更改为httpd进程所有者的主要组,名为apache。这个所有者在PHP运行时处于活动状态。我已通过以下方式证实了这一点:

enter image description here

如您所见,流程所有者为apache,当前目标为/var/www/html/php-console。该目录由www-data拥有,并且该组apache的成员可以完全访问该目录。

我已尝试以下方法让PHP在这个位置实际创建一个文件,但无济于事:

chmod 777 /var/www/html/php-console

chown apache /var/www/html/php-console
chgrp apache /var/www/html/php-console

cd /var/www/html; > test.txt; chmod 777 test.txt;

从浏览器运行此脚本时,什么都不起作用。但是,当我在PHP CLI中使用file_put_contents时,它就像我期望的那样工作,只要我输入命令的用户或其组具有对此目录或测试文件的写权限。

enter image description here

因此,从命令行中,您可以看到www-data对我所在文件夹的读取,写入和执行权限。posix_getpwuidposix_geteuid可帮助您找到Apache / PHP进程的所有者,在这种情况下与登录控制台的用户相同。 file_put_contents成功地将8个字节写入指定的文件。如果我将组或所有者和组更改为其他内容,我会被拒绝,这绝对有意义。

如果这在命令行上有效,那么为什么不在我真正想要的时候,即在实际提供网页时呢?

1 个答案:

答案 0 :(得分:1)

因为您忘记阅读httpd_selinux(8)手册页并为目录提供适当的文件上下文以允许Web服务器在那里写文件。