2017-02-16 146 views
1

我知道這是一個常見問題,但我沒有能夠針對我的具體用例單獨解決問題,所以請耐心等待。PHP file_put_contents返回'權限被拒絕'

我有一個簡單的PHP腳本send_id,它只是發送一個ID號碼並將其保存到運行Apache 2.4.6的RHEL服務器上的TXT文件中,並使用PHP 5.4。

錯誤消息: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

回答

-1

我通過簡單地在我的困擾PHP腳本住在目錄中運行chcon -Rt httpd_sys_content_rw_t解決這個問題。

+1

是的,+1不只是禁用SELinux! – miken32

+0

好吧...雖然這將工作,不能推薦..請參閱我的回答 –

+0

Aaaaand這是什麼做的到底是什麼? – TerranRich

-1

嘗試更改文件夾和文件的所有者到(chown)到「www-data」或「www-data:www-data」並查看如果它改變了什麼...

+0

不好,很遺憾沒有做任何事情 –

-1

使用來自Apache的「文檔根目錄」來引用文件相對文件路徑PHP。這是Apache的權限很重要,出於安全原因,它被編碼爲禁止訪問DOCUMENT_ROOT之外的文件..(是的,即使您的路徑在它內部導致,只要它看到路徑以「/ VAR」開頭就會被阻止。 。

假設這個PHP腳本是在同一目錄id.txt文件,只是使用

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

或者,如果txt文件是在一個子目錄

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

不僅是它很安全,鍵入的時間也縮短了很多。

+0

「一旦它看到路徑以/ VAR開頭,Apache就會被阻止」這是一堆廢話。 – miken32

+0

起初是'./id.txt',但仍然導致問題。我的解決方案已經解決了這個問題 –