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