Php 为什么从浏览器运行文件内容时会出现权限问题?

Php 为什么从浏览器运行文件内容时会出现权限问题?,php,linux,apache,permissions,Php,Linux,Apache,Permissions,这个问题在这里已经被问了好几次了,但我还没有找到解决办法。我有一个Fedora19 LAMP服务器,我只想运行一个简单的命令:file\u put\u contents('test.txt','Hello here')以确认我的web服务器可以使用PHP将数据写入文件。我很难想出一个合适的权限方案。首先,为了便于开发,Apache的文档根是/var/www/html。该目录最初由名为www-data的用户和组拥有,但我将目录的组更改为httpd进程所有者的主组,名为apache。当PHP运行时,

这个问题在这里已经被问了好几次了,但我还没有找到解决办法。我有一个Fedora19 LAMP服务器,我只想运行一个简单的命令:
file\u put\u contents('test.txt','Hello here')以确认我的web服务器可以使用PHP将数据写入文件。我很难想出一个合适的权限方案。首先,为了便于开发,Apache的文档根是
/var/www/html
。该目录最初由名为
www-data
的用户和组拥有,但我将目录的组更改为httpd进程所有者的主组,名为
apache
。当PHP运行时,这个所有者是活动的。我通过以下几点证实了这一点:

如您所见,进程所有者是apache,当前目录是var/www/html/php控制台。该目录归
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\u put\u contents
时,它的工作原理与我预期的一样,前提是我输入命令的用户或其组具有对此目录或测试文件的写入权限

因此,从命令行中,您可以看到
www-data
对我所在的文件夹具有读取、写入和执行权限
posix_getpwuid
posix_geteuid
帮助您找到Apache/PHP进程的所有者,在本例中,该所有者与登录控制台的用户相同<代码>文件内容成功地将8个字节写入指定文件。如果我将组或所有者和组更改为其他内容,我会被拒绝许可,这绝对是有道理的


如果这在命令行上起作用,那么为什么不在我真正想要它的时候,也就是说,在实际为网页提供服务的时候呢?

因为您忘记了阅读
httpd\u selinux(8)
手册页,并为目录提供适当的文件上下文以允许web服务器在那里写入文件。

因为您忘记了阅读
httpd\u selinux(8) 
手册页,并为目录提供适当的文件上下文,以允许web服务器在其中写入文件。

非常感谢您提醒我这一点。我一直在阅读
httpd\u selinux(8)
以及其他在线讨论,我不清楚应该设置什么文件上下文。就sebooleans而言,我的系统上的
getsebool
告诉我httpd_内置脚本、httpd_统一和httpd_启用cgi是启用的。然后我运行了:semanage fcontext-a-t httpd_sys_content_/var/www(/)*”restorecon-R-v/var/www只是简单地给那里的一切httpd sys读/写访问权,但我仍然被拒绝了权限…对不起,我不小心在我的评论中复制了错误的文本。我确实将
/var/www
下的所有内容的文件上下文设置为
httpd_sys_rw_content_t
e
,关于我目前最感兴趣的目录的文件上下文,返回我所期望的:
drwxrwxr-x.www-data www-data-unconfined\u:object\u r:httpd\u sys\u rw\u content\u t:s0/var/www/html/php控制台
,但我在php控制台中的代码片段仍然给我“权限被拒绝”。通过了
ls-Zd
命令
exec
在我的代码片段中确认了相同的文件上下文。叹气……还有其他想法吗?@williamcwilliams:Give
audit2why-a-l
尝试一下。您可能希望将结果重定向到一个文件中以便于处理。非常感谢您提醒我注意这一点。我一直在阅读
httpd_selinux(8)
以及其他在线讨论,我不清楚应该设置什么文件上下文。就sebooleans而言,我的系统上的
getsebool
告诉我httpd_内置脚本、httpd_统一和httpd_启用cgi是启用的。然后我运行了:semanage fcontext-a-t httpd_sys_content_/var/www(/)*”restorecon-R-v/var/www只是简单地给那里的一切httpd sys读/写访问权,但我仍然被拒绝了权限…对不起,我不小心在我的评论中复制了错误的文本。我确实将
/var/www
下的所有内容的文件上下文设置为
httpd_sys_rw_content_t
e,关于我目前最感兴趣的目录的文件上下文,返回我所期望的:
drwxrwxr-x.www-data www-data-unconfined\u:object\u r:httpd\u sys\u rw\u content\u t:s0/var/www/html/php控制台
,但我在php控制台中的代码片段仍然给我“权限被拒绝”。通过了
ls-Zd
命令
exec
在我的代码片段中确认了相同的文件上下文。叹气……还有其他想法吗?@williamcwilliams:Give
audit2why-a-l
尝试一下。你可能想将结果重定向到一个文件中以便于处理。奇怪……所以我想再试一次
chmod 777/var/www/html/php控制台
,这一次它让我感觉更好我把它改回了文件。然后我把它改回了
775
,我仍然可以运行
file\u put\u contents
,没有权限错误。我重新启动了我的计算机,我仍然可以运行这个代码。我决定将
/var/www
的文件上下文从
httpd\u sys\u rw\u content\t
改成
httpd\u sys\u content\u t
,它仍然可以运行工作正常。然后我尝试关闭了
httpd_unified
,再次出现了权限错误。我不完全确定它是否在一开始就被关闭了。无论如何,感谢您的帮助,IgnacioOne请注意:当我关闭
httpd_unified
时,那么
httpd_sys_rw_content_t
文件上下文确实是编写fi所必需的非常有趣…我最近不得不