Apache 在更改DocumentRoot,或新增虛擬目錄之後出現403錯誤的解決方法彙總詳解(Linux)

http://blog.csdn.net/younger_z/article/details/8714089

Check every directory from where the file is located all the way up to 
the root. It is likely one of the parent directories that doesn't have 

search (+x) permission for the apache user. 


【一】關於本文


  1. 本文講述在Linux系統下編譯安裝Apache之後,自行更改DocumentRoot目錄指向後,站點出現403錯誤,瀏覽器中顯示:Forbidden You don't have permission to access / on this server.


  2. 或者設置虛擬目錄後的403錯誤。


  3. Apache的httpd服務已經成功啓動,一切看似正常,卻顯示無權限的問題


  4. 查看錯誤日誌,其中出現access to / denied (filesystem path '/usr/local/site/test') because search permissions are missing on a component of the path條目


  5. 設置虛擬目錄後,錯誤日誌出現:client denied by server configuration: /usr/local/folder


  6. 本文采用系統:Linux Red Hat Enterprise Linux 6(VMware); Apache版本:2.2.23


  7. Apache安裝目錄:/usr/local/apache



【二】錯誤彙總


  1. 首先,已經更改httpd.conf配置文件中的DocumentRoot爲"/usr/local/site/test",site目錄和test目錄使用mkdir建立完成,並在test目錄下建立index.html,這時,應該查看httpd.conf中如下一段內容:


<Directory "/usr/local/apache/htdocs">                       
    #                                        
    # Possible values for the Options directive are "None","All",          
    # or any combination of:                            
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews   
    #                                        
    # Note that "MultiViews" must be named *explicitly* --- "Options All"      
    # doesn't give it to you.                            
    #                                        
    # The Options directive is both complicated and important.  Please see     
    # http://httpd.apache.org/docs/2.2/mod/core.html#options            
    # for more information.                             
    #                                        
    Options FollowSymLinks                             

    #                                        
    # AllowOverride controls what directives may be placed in .htaccess files.   
    # It can be "All", "None", or any combination of the keywords:         
    #   Options FileInfo AuthConfig Limit                      
    #                                        
    AllowOverride all                                

    #                                       
    # Controls who can get stuff from this server.                  
    #                                       

#   onlineoffline tag - don't remove                        
    Order Deny,Allow                                
    Deny from all                                  
    Allow from 127.0.0.1                               

</Directory>                                     


在該段內容中,<Directory "/usr/local/apache/htdocs">的目錄要更改成與DocumentRoot相一致,因爲這段direcotory是apache對該目錄的訪問權限設定,只有設置正確的目錄,DocumentRoot纔會生效;


  2. 同樣是在httpd.conf中,在第一條所示片段之前,有這樣一段:


<Directory />                                   
    Options FollowSymLinks                             
    AllowOverride None                               
    Order deny,allow                                
    Deny from all                                 
</Directory>                                    


網上有許多文章介紹說,將它之間Deny from all修改爲Allow from all,這是相當不負責任的說法,如果你這麼做了,更對不起自己,這是禁止apache對根目錄“/”以下所有內容禁止訪問的設定,也是網站安全設置中最基本的設置,因爲有第一條的片段在這段之後,只開通對應網站根目錄的權限就可以了,如果將整個服務器的根目錄都開放,一但有人試圖上傳一段可執行代碼在不應該出現的目錄裏,後果不堪設想....


  3. 如果做到這一步,你的apache還是很頑固地403、403,那麼,你就應該考慮網站目錄的權限問題了,首先是目錄的基本權限,apache要求目錄具有執行權限,也就是x,而其中要注意的,你的目錄樹都應該擁有這些權限,目前我設置的是755,網上有文章說705就可以搞定,我還沒具體測試,比如我的網站根目錄是/usr/local/site/test,那麼,你要保證/usr、/usr/local、/usr/local/site、/usr/local/site/test這四個層級的目錄都是755權限,而我本人就只注意到最末的子目錄test,卻忽視了site層級,就悲催地弄了許久....



    chmod 755 /usr/local/site                            

    chmod 755 /usr/local/site/test                         


  小提示:上面這兩段命令可以簡化成(不過這樣設置之後,文件夾中的所有文件都會是755權限,所以請在網站目錄內還沒有文件時進行此設置):

    chmod -R 755 /usr/local/site*                          



(補充:我個人分析,apache對DocumentRoot目錄的訪問應該是以“all”這個用戶級別進行的,所以705也好,755也好,都是一個等級,如果你的網站是由PHP生成靜態頁面的話,還要擁有寫權限,也就是說,“all"用戶必須是7,當然,出於對服務器安全的角度,你不可以把apache這個用戶加入到root組,因爲有許多系統級文件對組的要求有所放寬,所以要對DocumentRoot這個目錄中各個級別的目錄分別進行權限設置,比如只有一部分目錄的文件是需要生成的,那麼就只將這部分目錄設置爲可寫。)



  4. 如果你設置的是一個虛擬目錄,那麼你需要在httpd.conf中定義一個虛擬目錄,而且像極了如下的片段:


Alias /folder "/usr/local/folder"                       

<Directory "/usr/local/folder">                         
    Options FollowSymLinks                            
    AllowOverride None                              
    Order deny,allow                               
    Deny from all                                 
    Allow from 127.0.0.1 192.168.1.1                       
</Directory>                                   


如果是這一種情況,而且你寫得類似我上面的代碼,三處folder都是一樣一樣的,那絕對會是403!怎麼解決呢,就是把跟在Alias後面斜槓後面的那串改了,改成什麼,不要和虛擬目錄的文件夾同名就好,然後我就可以用改過後的虛擬目錄訪問了,當然,改文件夾也行,只要你不怕麻煩,只要Alias後面的虛擬目錄定義字符(紅色)和實際文件夾名(黑色)不相同就OK。



  5. 如果依然是403,那就是selinux在作怪了,於是,你可以把你的目錄進行一下selinux權限設置


    chcon -R -t httpd_sys_content_t /usr/local/site                 

    chcon -R -t httpd_sys_content_t /usr/local/site/test               


不過,這一步大多不會發生,但以防萬一,我還是寫上來了。




【三】結語


  1. 在linux系統中,如果希望對某個子目錄擁有特定權限,那麼它的父目錄也應該擁有該權限(根據遇到的問題猜測)


  2. 網上也有許多誤導性質的文章,閱讀和參考的時候,要擁有比較強的分辨能力,否則很容易“誤入歧途”


  3. 要養成看錯誤日誌的習慣,我本人就是沒有這個習慣,纔會白白地花掉小半天的時間來處理這樣一個小小的錯誤。Apache的默認錯誤日誌爲:/usr/local/apache/logs/error_log


  4. 上網搜索時,不要一味使用一套關鍵詞,而是多多更換可能的詞彙來搜索,會有意外驚喜!


發佈了20 篇原創文章 · 獲贊 5 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章