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

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

【一】關於本文

  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. 上網搜尋時,不要一味使用一套關鍵詞,而是多多更換可能的詞彙來搜尋,會有意外驚喜!