使用SetEnvIfNoCase配置.htaccess过滤Bot失效,谷歌Bot仍被拦截
问题根源与解决方案
这个问题我之前碰到过类似的坑,核心是规则匹配逻辑和Order指令的优先级顺序在搞鬼,咱们一步步拆解:
为什么谷歌Bot会被误拦截?
你的bad_bot规则里有这么一条:
SetEnvIfNoCase User-Agent .*bot.* bad_bot
而谷歌Bot的用户代理字符串Googlebot/2.1 (+http://www.googlebot.com/bot.html)里明确包含bot,所以它直接被标记成了bad_bot。
虽然你添加了good_bot的规则,但你的访问控制逻辑是:
Order Allow,Deny Allow from all Deny from env=bad_bot
Order Allow,Deny的执行顺序是先允许所有请求,再拒绝符合bad_bot的请求——Deny规则的优先级更高,哪怕请求同时被标记为good_bot和bad_bot,最终还是会被拒绝。
两种可行的解决方案
方案一:精准过滤Bad Bot(推荐)
修改bad_bot的匹配规则,直接排除已知的合法Bot,避免误匹配:
# UniversalRules SetEnvIfNoCase User-Agent ^$ bad_bot # 拦截空白用户代理 SetEnvIfNoCase User-Agent .*\@.* bad_bot # 拦截带@的UA(通常是垃圾爬虫) # 仅拦截包含bot,但不属于谷歌、必应的请求 SetEnvIfNoCase User-Agent "(?=.*bot)(?!.*google|.*bingbot)" bad_bot # Goodbots(可选,这里可以保留也可以去掉,因为上面的规则已经排除了它们) SetEnvIfNoCase User-Agent .*google.* good_bot SetEnvIfNoCase User-Agent .*bingbot.* good_bot # 访问控制规则不变 Order Allow,Deny Allow from all Deny from env=bad_bot
这里用了正则的正向预查(?=.*bot)和负向预查(?!.*google|.*bingbot),确保只有含bot但不是谷歌、必应的UA才会被标记为bad_bot。
方案二:调整访问控制的优先级顺序
把Order Allow,Deny改成Order Deny,Allow,并调整规则顺序,让good_bot的允许规则覆盖bad_bot的拒绝规则:
# UniversalRules SetEnvIfNoCase User-Agent ^$ bad_bot SetEnvIfNoCase User-Agent .*\@.* bad_bot SetEnvIfNoCase User-Agent .*bot.* bad_bot # Goodbots SetEnvIfNoCase User-Agent .*google.* good_bot SetEnvIfNoCase User-Agent .*bingbot.* good_bot # 调整访问控制顺序:先拒绝bad_bot,再允许good_bot和其他请求 Order Deny,Allow Deny from env=bad_bot Allow from env=good_bot Allow from all
Order Deny,Allow的逻辑是先处理拒绝规则,再处理允许规则,如果一个请求同时被标记为bad_bot和good_bot,允许规则会覆盖拒绝规则,这样谷歌Bot就能正常访问了。
内容的提问来源于stack exchange,提问作者Alexey Shatrov
相关产品推荐
相关产品推荐

