apache屏蔽某UA,是通過設置 SetEnvIfNoCase User-Agent
來實現(xiàn),不過我發(fā)現(xiàn)網(wǎng)上很多文章的寫法是不正確的,我親測后,把正確的寫法記下來,同時也把錯誤的寫法記下來,以被日后參考。
舉例說明,假如apache要屏蔽的UA包含字符串“Googlebot”,那么 SetEnvIfNoCase User-Agent
的設置該如何寫呢?
正確寫法是:
SetEnvIfNoCase User-Agent ^.*Googlebot.* bad_bot
Order allow,deny
Allow from all
Deny from env=bad_bot
錯誤寫法:
SetEnvIfNoCase User-Agent "^.*Googlebot.*" bad_bot
...
代碼分析:
符號“^
”表示字符串開始位置,“.*
”表示任意字符。
錯誤的寫法是多了雙引號“"
”,SetEnvIfNoCase User-Agent
后面的字符串是不需要用雙引號引住的,否則是設置錯誤,不能按預期屏蔽某個UA。
但如果字符串不需要用到正則時,可以用雙引號。例如下面的例子寫法:
SetEnvIfNoCase User-Agent "Baiduspider" bad_bot
Order Allow,Deny
Allow from All
Deny from env=bad_bot
SetEnvIfNoCase User-Agent "Baiduspider"
是指這個UA的字符串中包含 Baiduspider
這幾個字符。本例 Baiduspider
要不要雙引號都可以,因為沒有用到正則。
知識擴展:一個很有用的apache指令SetEnvIfNoCase
說明:根據(jù)請求的屬性設置環(huán)境變量,而不考慮情況。
語法:SetEnvIfNoCase 屬性 正則 [!]環(huán)境變量[=值] [[!]環(huán)境變量[=值]] ...
上下文:服務器配置, 虛擬主機, 目錄, .htaccess
覆蓋項:FileInfo
狀態(tài):Base
模塊:mod_setenvif
兼容性:Apache 1.3 and above
SetEnvIfNoCase
與 SetEnvIf
指令語義相同,不同之處在于正則表達式匹配是不區(qū)分大小寫的方式進行。例如:
SetEnvIfNoCase Host Apache\.Org site=apache
如果 HTTP 請求頭“Host:
”包含 Apache.Org
, apache.org
,或其他任何組合,就把環(huán)境變量 site 的值設為“apache”。SetEnvIfNoCase
當滿足某個條件時,為變量賦值,一般結(jié)合其他指令使用。
如:
1、
SetEnvIf Request_URI "/logo(.)+" local_ref=0
Allow from env=local_ref
當local_ref
有值時,可以訪問。
2、
SetEnvIfNoCase Request_URI .js$ useless-file
CustomLog logs/hebgc.com/access.log combined env=!useless-file
當滿足條件時才記錄日志。