PHP file_put_contents返回' Permission Denied' (由于SELinux设置)

时间:2017-02-16 21:44:53

标签: php apache rhel selinux

我知道这是一个常见的问题,但我还没能为我的具体用例挑出问题,所以请耐心等待。

我有一个简单的PHP脚本send_id,只需发送一个ID号并将其保存到运行Apache 2.4.6和PHP 5.4的RHEL服务器上的TXT文件中。

错误消息:Warning: file_put_contents(/var/www/html/id.txt): failed to open stream: Permission denied in /var/www/html/send_id.php on line 6 '1' written to server

PHP脚本本身:

<?php
$id=$_GET['id'];
$stringData = "$id";
$file = file_put_contents('/var/www/html/id.txt', $stringData.PHP_EOL , FILE_APPEND |LOCK_EX);
echo "'$stringData' written to server";
?>

chmodding到777没有做任何事情。此外,我检查了所有权,并注意到id.txt文件由root用户在用户/组级别拥有,而PHP正在根级别运行。

有人有什么建议吗?如果有任何帮助,这似乎发生在yum update

之后

3 个答案:

答案 0 :(得分:1)

我通过在我遇到问题的PHP脚本所在的目录上运行chcon -Rt httpd_sys_content_rw_t来解决这个问题。

附加说明

ls -alZ *

-Z开关可与大多数实用程序一起显示SELinux安全上下文

答案 1 :(得分:-1)

尝试将文件夹和文件的所有者更改为(chown)到“www-data”或“www-data:www-data”,看看它是否有任何改变......

答案 2 :(得分:-1)

使用来自Apache&#34; DOCUMENT ROOT&#34;的相对文件路径。在PHP中引用文件。它的Apache权限很重要,出于安全考虑,它被编码为禁止访问DOCUMENT_ROOT之外的文件..(是的,即使你的路径在其中引导,Apache也会在看到它时立即被阻止路径以&#34; / VAR&#34; ..

开头

假设此PHP脚本与id.txt文件位于同一目录中,请使用

$file = file_put_contents('./id.txt', $str...      

或者txt文件是否在子目录中

file_put_contents('./sub-dir/id.txt', $str... 

不仅安全,而且输入也要短得多。