因此,最經常使用的是:
Order Deny,Allow
Allow from Allhtml
注意「Deny,Allow」中間只有一個逗號,也只能有一個逗號,有空格都會出錯;單詞的大小寫不限。上面設定的含義是先設定「先檢查禁止設定,沒有禁止的所有容許」,而第二句沒有Deny,也就是沒有禁止訪問的設定,直接就是容許全部訪問了。這個主要是用來確保或者覆蓋上級目錄的設置,開放全部內容的訪問權。apache
按照上面的解釋,下面的設定是無條件禁止訪問:
Order Allow,Deny
Deny from Allwindows
若是要禁止部份內容的訪問,其餘的所有開放:
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決定的「最後」規則很是重要,下面是兩個錯誤的例子和改正方式:dom
Order Deny,Allow
Allow from all
Deny from domain.org
錯誤:想禁止來自domain.org的訪問,可是deny不是最後規則,apache在處理到第二句allow的時候就已經匹配成功,根本就不會去看第三句。
解決方法:Order Allow,Deny,後面兩句不動,便可。post
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測試
下面是測試過的例子:
--------------------------------
Order deny,allow
allow from all
deny from 219.204.253.8
#所有均可以通行
-------------------------------
Order deny,allow
deny from 219.204.253.8
allow from all
#所有均可以通行
-------------------------------
Order allow,deny
deny from 219.204.253.8
allow from all
#只有219.204.253.8不能通行
-------------------------------
Order allow,deny
allow from all
deny from 219.204.253.8
#只有219.204.253.8不能通行
-------------------------------
-------------------------------
Order allow,deny
deny from all
allow from 219.204.253.8
#所有都不能通行
-------------------------------
Order allow,deny
allow from 219.204.253.8
deny from all
#所有都不能通行
-------------------------------
Order deny,allow
allow from 219.204.253.8
deny from all
#只容許219.204.253.8通行
-------------------------------
Order deny,allow
deny from all
allow from 219.204.253.8
#只容許219.204.253.8通行
-------------------------------
--------------------------------
Order deny,allow
#所有均可以通行(默認的)
-------------------------------
Order allow,deny
#所有都不能通行(默認的)
-------------------------------
Order allow,deny
deny from all
#所有都不能通行
-------------------------------
Order deny,allow
deny from all
#所有都不能通行
-------------------------------
對於上面兩種狀況,若是換成allow from all,則所有均可以通行!
-------------------------------
Order deny,allow
deny from 219.204.253.8
#只有219.204.253.8不能通行
-------------------------------
Order allow,deny
deny from 219.204.253.8
#所有都不能通行
-------------------------------
Order allow,deny
allow from 219.204.253.8
#只容許219.204.253.8通行
-------------------------------
Order deny,allow
allow from 219.204.253.8
#所有均可以通行
-------------------------------
-------------------------------
order deny,allow
allow from 218.20.253.2
deny from 218.20
#表明拒絕218.20開頭的IP,但容許218.20.253.2經過;而其它非218.20開頭的IP也都容許經過。
-------------------------------
order allow,deny
allow from 218.20.253.2
deny from 218.20
#和上面的差很少,只是掉換的order語句中的allow、deny前後順序,但最終結果表示所有都拒絕!url
前段時間作了個Apache的HTTP代理服務器,其中的order allow,deny這部分弄的不太懂,因而上網找資料看,誰知道越看越糊塗,其中有些難以分辨對錯甚至是誤導。就像破解windows系統密碼的一些文章那樣,不少都是人云亦云的,並無通過測試。廢話少說,先把我通過測試後分析總結出來的結論show出來,相信這對你們的理解很是有幫助。spa
總則——設計
影響最終判斷結果的只有兩點:
1. order語句中allow、deny的前後順序;
2. allow、deny語句中各自包含的範圍。
舒適提醒——
1. 修改完配置後要保存好並重啓Apache服務,配置才能生效;
2. 開頭字母不分大小寫;
3. allow、deny語句不分前後順序,誰先誰後不影響最終判斷結果;但都會被判斷到;
4. order語句中,「allow,deny」之間「有且只有」一個逗號(英文格式的),並且前後順序很重要;
5. Apache有一條缺省規則,「order allow,deny」自己就默認了拒絕全部的意思,由於deny在allow的後面;同理,「order deny,allow」自己默認的是容許全部;固然,最終判斷結果還要綜合下面的allow、deny語句中各自所包含的範圍;(也就是說order語句後面能夠沒有allow、deny語句)
6. allow、deny語句中,第二個單詞必定是「from」,不然Apache會因錯而沒法啓動,
7. 「order allow,deny」表明先判斷allow語句再判斷deny語句,反之亦然。
上面說的都是要記住的,而下面說的是我首創的理解方法。若是有人看了而沒有豁然開朗的感受,那算是個人失敗!
判斷原則分4步走——
1. 首先判斷默認的;
2. 而後判斷逗號前的;
3. 最後判斷逗號後的;
4. 最終按順序疊加而得出判斷結果。
上面三點我說的簡單而形象,主要是爲了便於記憶。暫時不理解沒關係,繼續看下面詳細的解說天然會明白。下面以一個普通例子來作解釋——
order deny,allow
allow from 218.20.253.2
deny from 218.20
1. 所謂「首先判斷默認的」,就是判斷「order deny,allow」這句,它默認是容許全部;
2. 所謂「而後判斷逗號前的」,由於在本例子中的order語句裏面,deny在逗號的前面,因此如今輪到判斷下面的deny語句了——「deny from 218.20」;
3. 所謂「最後判斷逗號後的」,由於在本例子中的order語句裏面,allow在逗號的後面,因此最後輪到判斷下面的allow語句了——「allow from 218.20.253.2」。
4. 所謂「最終按順序疊加而得出判斷結果」,這是一個形象化了的說法,我把每一步判斷都看做一個「不透明的圖層」,而後一步步按順序疊加上去,最終得出的「圖像」就是判斷結果。
用過做圖軟件的人應該都知道「圖層」是怎麼回事,我估計Apache關於order allow deny這方面的設計理念和photoshop等做圖軟件關於圖層的設計理念是同樣的。即「遊戲規則」是同樣的。
那麼上面的例子就能夠是這麼一個步驟和圖像——
1. 先畫一個白色的大圓,表明「order deny,allow」語句,默認意思是容許全部;
2. 而後畫一個小一點的黑色圓,表明「deny from 218.20」語句,意思是拒絕全部以218.20開頭的IP,放進白色的大圓裏面;
3. 最後再畫一個白色的圓,表明「allow from 218.20.253.2」語句,意思是容許218.20.253.2經過,放在黑色圓的上面。
4. 到此爲止,咱們已經能夠看到一個結果了,白色大圓上面有一個黑色圓,黑色圓上面還有一個白色圓。最後,咱們所能看到的黑色部分就是拒絕通行的,剩下的白色部分都是容許通行的。判斷的結果就是這麼簡單形象!
若是不懂的用做圖軟件,咱們再來個很是貼近生活的比喻——
把上面的例子改動一點點,以便更好的理解:
order deny,allow
allow from 218.20.253.2
deny from 219.30
1. 首先拿一張A4白紙,表明第order語句,意思是容許所有;
2. 而後拿一張黑色紙剪一個圓,放在A4紙裏面的某個位置上,表明deny語句,意思是拒絕全部以219.30開頭的IP;
3. 最後拿白紙再剪一個圓,放在黑色圓的旁邊,表明allow語句,意思是容許218.20.253.2經過;注意,這個例子不是放進黑色圓裏面了,由於deny和allow語句再也不有相互包含的關係了。
4. A4紙上面有一個黑色圓和一個白色圓,結果天然很明顯了。不過白色的A4紙上再放一個白色的圓,顯然是多餘的了,由於你們都是白色的,都表明容許,因此就重複了,能夠去掉白色的圓而不會影響判斷結果。
若是看到這裏還沒明白,那必定是我還有什麼沒說清楚的。那麼請好好分析我所作過的測試例子,將在最後列出來。
在這裏再囉嗦一下,allow、deny語句後面跟的參數有多種形式,有不一樣的表達方式,我在網上看到的作法是deny from IP1 IP2 IP3或allow from domain.com等。其它的表達方式你們再找別的資料看吧。我想說的是另外一種表達方式:
order deny,allow
allow from IP1 IP2
allow from domain.info
allow from 219.20.55.0/24
deny from all
我沒具體驗證過這是否對,不過這樣是能夠正常啓動Apache服務的,按道理應該是正確的表達方式。哈哈,像我這樣的入門者只能這樣了,還但願你們多多指教!
下面是測試過的例子:--------------------------------Order deny,allowallow from alldeny from 219.204.253.8#所有均可以通行-------------------------------Order deny,allowdeny from 219.204.253.8allow from all#所有均可以通行-------------------------------Order allow,denydeny from 219.204.253.8allow from all#只有219.204.253.8不能通行-------------------------------Order allow,denyallow from alldeny from 219.204.253.8#只有219.204.253.8不能通行--------------------------------------------------------------Order allow,denydeny from allallow from 219.204.253.8#所有都不能通行 -------------------------------Order allow,denyallow from 219.204.253.8deny from all#所有都不能通行 -------------------------------Order deny,allowallow from 219.204.253.8deny from all#只容許219.204.253.8通行 -------------------------------Order deny,allowdeny from allallow from 219.204.253.8#只容許219.204.253.8通行 ---------------------------------------------------------------Order deny,allow#所有均可以通行(默認的)-------------------------------Order allow,deny#所有都不能通行(默認的)-------------------------------Order allow,denydeny from all#所有都不能通行-------------------------------Order deny,allowdeny from all#所有都不能通行-------------------------------對於上面兩種狀況,若是換成allow from all,則所有均可以通行!-------------------------------Order deny,allowdeny from 219.204.253.8#只有219.204.253.8不能通行-------------------------------Order allow,denydeny from 219.204.253.8#所有都不能通行-------------------------------Order allow,denyallow from 219.204.253.8#只容許219.204.253.8通行-------------------------------Order deny,allowallow from 219.204.253.8#所有均可以通行--------------------------------------------------------------order deny,allowallow from 218.20.253.2deny from 218.20#表明拒絕218.20開頭的IP,但容許218.20.253.2經過;而其它非218.20開頭的IP也都容許經過。-------------------------------order allow,denyallow from 218.20.253.2deny from 218.20#和上面的差很少,只是掉換的order語句中的allow、deny前後順序,但最終結果表示所有都拒絕!