2010年7月1日 星期四

htaccess 的 Order allow,deny 迷思 [簡易版]

近日再做htaccess,發現自己也遺忘了許多,本文不會做多高深的討論htaccess能做甚麼,只是簡單的再說明一下,htaccess裡面 Order allow,deny的邏輯思維。

首先在httpd.conf中,要先把AllowOverride設成all(或你想要的權限),這樣htaccess才有權力去做細部管理。

大家都知道.htaccess可以細部調節網站內每個目錄的細部權限,其中有一個很受歡迎的做法,就是Block IP 或 Block Region。一般做法像這樣..

order allow,deny
deny from 123.123.123.123
allow from all

意思是允許所有人訪問,除了123.123.123.123的訪問。

所以當有一個來自111.123.111.112的 IP 訪問網站,他會匹配到 allow from all ,並且沒deny,予以通行。

其實 .htaccess裡面 共沒有上下順序這東西,allow與deny的順序是由order來決定,而後者會比前者的權限來的高(觀念上是這樣啦),所以如果有一個訪問附合allow與deny兩條rule,以上面的order來說,最後會跑deny的rule。

例:
order deny,allow
deny from 192.168.100.0/24
allow from 192.168.100.100


這例子有點古怪,不過可以表達我的邏輯。如果有一個訪問是從192.168.100.100過來,他會匹配到deny from 192.168.100.0/24和allow from 192.168.100.100兩條rule,他會先檢查deny,
禁止訪問,再檢查allow,予以通行,即192.168.100.100最後是可以訪問的。而另外還有一個210.47.84.234的外部IP來訪問的話,他到底匹配了甚麼呢? 答案是兩條都不匹配,結果會是...予以通行。 因為如果deny與allow都不匹配的話,會以order的最後順序來決定訪問權,即是上例的allow。

好,到目前為止應該尚算清楚。以下是一條我實際操作過的疑團(本身沒那麼謎的,是搞神秘而已)

order deny,allow
deny from 192.168.100.0/24
deny from 192.168.84.0/24
deny from 192.168.50.0/24
allow from all

目的是為了封閉192.168.100.x、192.168.84.x和192.168.50.x。但不work...為甚麼?

答案顯淺而見,因為如果照上例來說當一個192.168.84.52進來,他會匹配到兩條規則,其中一條是allow from all,偏偏order的最後順序又是allow,所以....

解決方法,要不將order deny,allow 改成 order allow,deny,要不就直接把allow from all刪掉,邏輯上能簡單地理解吧。

最後,附上一些allow deny在htaccess上的IP表達方式

完整IP地址: allow from 111.222.111.123
部份IP地址: allow from 111.222 (= 111.222.0.0 / 16 , 範圍可大了)
IP w/ mask: allow from 111.222.111.0/255.255.255.0 (顯淺易見,範圍是111.222.111.0-111.222.111.254)
CDIR:          allow from 111.222.111.0/24 (與255.255.255.0一樣)

其他如 111.222.111.200-111.222.111.210  <===這種不可行的,殘念。

沒有留言:

Google