Apache關於Order Allow Deny的配置搞得我很混亂,總結一下吧:
<Directory "/var/www/html"> ## 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 Indexes 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 None ## Controls who can get stuff from this server.# Order deny,allow</Directory>
總則:
影響最終判斷結果的只有兩點:
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. 到此為止,我們已經可以看到一個結果了,白色大圓上面有一個黑色圓,黑色圓上面還有一個白點。最後,我們所能看到的黑色部分就是拒絕通行的,剩下的白色部分都是允許通行的。判斷的結果就是這麼簡單形象!
在這裡再囉嗦一下,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,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不能通行
具體分析一下:
1、由Order allow,deny得出是預設deny all,那麼就是說,這個圖的背景全部是黑色的;
2、先分析allow的規則,
allow from all,代表把黑色背景全部塗白;
3、再分析deny的規則,
deny from 219.204.253.8, 代表在全部塗白的背景上面點一個黑點;
好了,最終的規則就是:只有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
#全部都不能通行
具體分析一下:
1、由Order allow,deny得出是預設deny all,那麼就是說,這個圖的背景全部是黑色的;
2、先分析allow的規則,
allow from 219.204.253.8,代表在黑色背景上面點一個白點;
3、再分析deny的規則,
deny from all, 代表所有全部塗黑,自然也覆蓋了那個白點了;
好了,最終的規則就是:全部都不能通行
——————————-
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開頭的IP也都允許通過。
——————————-
order allow,deny
allow from 218.20.253.2
deny from 218.20
#和上面的差不多,只是掉換的order語句中的allow、deny先後順序,但最終結果表示全部都拒絕!
具體分析一下:
1、由Order allow,deny得出是預設deny all,那麼就是說,這個圖的背景全部是黑色的;
2、先分析allow的規則,
allow from 218.20.253.2,代表在黑色背景上面點一個白點;
3、再分析deny的規則,
deny from 218.20, 代表塗黑所有218.20.*.*的ip,自然也把218.20.253.2給覆蓋了,由於背景就是黑色的,所以都是黑色的了,最終結果表示全部都拒絕。