天天看點

Apache配置檔案中的deny和allow的使用

檢視原文:http://www.ibloger.net/article/306.html

Apache配置檔案中的deny和allow的使用

    由于産品的需要,最近在配置apache的負載均衡功能,但是在配置虛拟主機的通路權限的時候我們遇到了一些問題。主要問題是deny和allow的執行順序,抽時間研究了下這兩個參數的使用,現把deny和allow的使用情況總結如下。

一、   使用情況總結

我們來看下下面的apache的一個配置,具體代碼如下:

<Directory />

    Order allow,deny  #1

    Allow from all #2

    deny from 192.9.200.69 #3

</Directory>

以前使用這兩個參數的時候比較混亂,具體不太清楚到底是哪個參數在起作用。通過實驗,我們可以總結下規律,具體規律如下:

1.  規律

當我們看到一個apache的配置時,可以從下面的角度來了解。一預設,二順序,三重疊。

2.  上面配置說明

[1] 一預設

Order allow,deny ,這句話的作用是配置allow和deny的順序,預設隻有最後一個關鍵字起作用,這裡起作用的關鍵字就是“deny”,預設拒絕所有請求。為了便于了解,我們可以畫一個圓,圓的背景色塗上黑色,我們給這個圓起個編号,叫圓1。

[2] 二順序

由于上邊的Order指出判斷的順序是先判斷allow的規則,然後才是deny的規則。是以我們要先判斷allow的請求,由于該請求中配置的是allow from all,

是以表示該請求允許所有請求。這時我們再畫一個圓,背景色塗上白色,我們給圓起個編号,叫圓2。

我們再來看deny的判斷規則,由于 deny from 192.9.200.69 ,表示拒絕來自ip位址為“192.9.200.69”,是以我們可以畫出一塊紅色區域,表示“192.9.200.69”,我們把這塊區域叫區域3。

注意:即使把“Allow from all”寫在“deny from 192.9.200.69”下面,依然是需要先判斷allow規則,也就是說隻有Order才能決定allow和order的優先順序。

[3] 三重疊

我們把上邊産生的圓1、圓2和區域3依次從下往上堆疊在一起。每個層都是不透明的,這時我們可以看到最終效果是除了“192.9.200.69”這塊紅色區域外,其他的所有都是白色區域。也就是隻有“192.9.200.69”這個ip位址沒有權限通路該目錄,其他的請求都有權限通路該目錄。

二、   看看下面的例子

也許上邊沒有說明白,我們再來看下面的例子,每個配置後面都有簡單的說明,配置檔案中的“#”号後邊的數字表示配置項起作用的先後順序。

1.  隻允許192.9.200.69請求通路目錄 

<Directory />

        Order deny,allow #1.預設允許全部請求

        deny from all #2.按照順序,先判斷deny規則,拒絕所有請求

       Allow from 192.9.200.69 #3.重疊,允許IP192.9.200.69的請求

</Directory>

2.  允許所有請求通路目錄 

<Directory />

       Order deny,allow #1.預設允許全部請求

       deny from 192.9.200.69 #2.按照順序,先判斷deny規則,拒絕192.9.200.69的請求

       Allow from all #3.重疊,允許所有請求

</Directory>

3.  拒絕所有請求通路目錄

<Directory />

       Order allow,deny #1.預設拒絕全部請求

       Allow from 192.9.200.69 #2.順序,允許 192.9.200.69請求

       deny from  all#3.重疊,拒絕所有請求

</Directory>

4.  除了192.9.200.69的請求外,其他請求都可以通路目錄 

<Directory />

      Order allow,deny #1.預設拒絕全部請求

      Allow from all #2.順序,允許所有請求

      deny from  192.9.200.69#3.重疊,拒絕192.9.200.69請求

</Directory>

Allow和Deny可以用于apache的conf檔案或者.htaccess檔案中(配合Directory, Location, Files等),用來控制目錄和檔案的通路授權。

是以,最常用的是:

Order Deny,Allow

Allow from All

注意“Deny,Allow”中間隻有一個逗号,也隻能有一個逗号,有空格都會出錯;單詞的大小寫不限。上面設定的含義是先設定“先檢查禁止設定,沒有禁止的全部允許”,而第二句沒有Deny,也就是沒有禁止通路的設定,直接就是允許所有通路了。這個主要是用來確定或者覆寫上級目錄的設定,開放所有内容的通路權。

按照上面的解釋,下面的設定是無條件禁止通路:

Order Allow,Deny

Deny from All

如果要禁止部分内容的通路,其他的全部開放:

Order Deny,Allow

Deny from ip1 ip2

或者

Order Allow,Deny

Allow from all

Deny from ip1 ip2

apache會按照order決定最後使用哪一條規則,比如上面的第二種方式,雖然第二句allow允許了通路,但由于在order中allow不是最後規則,是以還需要看有沒有deny規則,于是到了第三句,符合ip1和ip2的通路就被禁止了。注意,order決定的“最後”規則非常重要,下面是兩個錯誤的例子和改正方式:

Order Deny,Allow

Allow from all

Deny from domain.org

錯誤:想禁止來自domain.org的通路,但是deny不是最後規則,apache在處理到第二句allow的時候就已經比對成功,根本就不會去看第三句。

解決方法:Order Allow,Deny,後面兩句不動,即可。

Order Allow,Deny

Allow from ip1

Deny from all

錯誤:想隻允許來自ip1的通路,但是,雖然第二句中設定了allow規則,由于order中deny在後,是以會以第三句deny為準,而第三句的範圍中又明顯包含了ip1(all include ip1),是以所有的通路都被禁止了。

解決方法一:直接去掉第三句。

解決方法二:

Order Deny,Allow

Deny from all

Allow from ip1