2014-11-22 56 views
1

這使我瘋了。 httpd以用戶apache身份運行。我在/ var/www/html中有兩個目錄 - 上傳和照片。都有組:apache:apache的所有者。兩者都是755. uploads可以從php寫入 - 照片不是。權限被拒絕寫入到一個目錄,但沒有寫入另一個 - 都擁有相同的所有者/組/ 755

一些測試代碼:

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')); 

和結果:通過外殼和GUI界面

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) 

我已經確認權限。我已經做好了準備,並再次將所有東西都沾上一切。我已將上傳目錄重命名爲其他內容,並將照片重命名爲上傳,以查看該目錄的名稱是否是此處的關鍵字,但事實並非如此。這是目錄本身。重命名的上傳仍然以新名稱起作用,而現在稱爲「上傳」的照片目錄不會。

值得注意的是,_test.log在測試之前並不存在於文件夾中,所以它不像是該文件具有不良的權限或任何內容。有趣的是,如果我創建一個新的目錄,將其設置爲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/'))); 

所有的 「阿帕奇」

都具有相同的fileperms()值。 但是,除了「上傳」之外,is_writable()都是錯誤的。

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()函數;我重新啓動了服務器。到底怎麼回事?

回答

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'檢查現有上下文。

+0

謝謝!我將其標記爲答案,因爲它是第一個,並讓我走上了正確的道路。這個問題確實與selinux有關,但chcon不能出於某種原因而工作,並且semanage沒有安裝在這臺服務器上。所以我yum安裝了semanage,然後運行以下兩個命令添加一個新的上下文,然後應用它:** semanage fcontext -a -t httpd_sys_rw_content_t/var/www/html/photos ** ... ** restorecon -Rv/var/www/html/** – Sarthaz 2014-11-24 14:19:43

1

如果selinux已啓用(sestatus會告訴您),請先嚐試sudo restorecon -Rv /var/www/。聽起來很像SELinux正在阻礙你,你有某種方式有一個文件/目錄沒有正確標記。 Restorecon會將標籤恢復爲默認值,並且-v會顯示哪些標籤已被更正(如果有的話)。

如果沒有這樣做,就會想到擴展屬性。做lsattr <filename>,如果輸出看起來像------i-----,則設置不可變標誌。改變它與chattr -i <filename>,你很好去。

+0

謝謝你的幫助! restorecon本身不起作用,但這個答案幫助我找到了解決方案。照片和上傳是通過同一個過程同時創建的,所以我不明白爲什麼需要特殊的上下文規則,而另一個則不需要,但現在正在工作。 – Sarthaz 2014-11-24 14:31:37

+1

@Sarthaz很高興你解決它。沒有一些嚴肅的挖掘,爲什麼上下文標籤混亂很難診斷。 (一個常見原因是移動文件,可能在SELinux同時被暫時禁用的情況下)。我會給你一個實際修復原因並在這裏共享的upvote,而不僅僅是關閉SELinux,大多數人都會關掉它*悲傷*推薦! :) – sysconfig 2014-11-24 14:56:30

相關問題