如何配置Apache Rewrite规则在凌晨0:30-2点封禁Twitterbot/1.0或指定IP
特定时段精准封禁Twitterbot/1.0的Apache实现方案
不需要像参考示例那样无差别封锁指定时段的全部流量,只需要在原有时间判断的基础上,叠加用户代理(UA)或者客户端IP的匹配条件,两个维度同时命中时才触发403禁止访问,完全不影响正常访客在对应时段的访问。
核心规则逻辑拆分
所有判断条件默认按“逻辑与”执行,也就是必须同时满足所有判断,才会触发封禁动作:
- 时间窗口精准匹配:覆盖凌晨0:30到2:00的全时段,排除0:00-0:29的正常流量
- 访问身份匹配:只拦截UA为
Twitterbot/1.0的请求,不拦截其他正常用户的浏览器UA - 可选叠加IP匹配:可根据观测到的爬虫真实来源IP,增加判断维度,避免UA被伪造时出现漏拦
可直接复用的完整配置
RewriteEngine On # 时间窗口判断:命中00:30:00 ~ 01:59:59的请求 # 0点时段:仅拦截00:30-00:59的请求 RewriteCond %{TIME_HOUR}:%{TIME_MIN} ^00:(3[0-9]|4[0-9]|5[0-9])$ [OR] # 1点时段:拦截01:00-01:59的全部请求 RewriteCond %{TIME_HOUR}:%{TIME_MIN} ^01:[0-5][0-9]$ # 身份判断:匹配携带Twitterbot/1.0 UA的请求 RewriteCond %{HTTP_USER_AGENT} ^.*Twitterbot/1\.0.*$ # 所有条件同时满足时,返回403状态码,终止后续规则执行 RewriteRule ^.*$ - [F,L]
可选扩展:叠加IP段封禁
如果已经观测到Twitterbot的爬取IP属于固定段,可调整规则逻辑为:时间在封禁窗口内 且 (UA匹配目标爬虫 或 来源IP属于目标爬取段),进一步提升封禁准确性,避免UA伪造绕过。调整后的配置片段为:
RewriteEngine On # 第一层判断:是否在封禁时间窗口(满足任意时间分支即命中) RewriteCond %{TIME_HOUR}:%{TIME_MIN} ^00:(3[0-9]|4[0-9]|5[0-9])$ [OR] RewriteCond %{TIME_HOUR}:%{TIME_MIN} ^01:[0-5][0-9]$ # 第二层判断:是否为目标爬取来源(满足任意身份分支即命中) # 两层判断之间默认按AND逻辑连接,必须同时满足才触发封禁 RewriteCond %{HTTP_USER_AGENT} ^.*Twitterbot/1\.0.*$ [OR] RewriteCond %{REMOTE_ADDR} ^爬虫IP段的正则匹配表达式$ RewriteRule ^.*$ - [F,L]
常见踩坑提醒
- 正则格式注意转义:UA和IP判断里的
.字符要加\转义,避免正则中.匹配任意字符导致误拦 - 提前校验时区:Apache的
%{TIME_*}变量取的是服务器本地时区的时间,配置前要确认服务器时区和观测到爬虫触发故障的时间一致,避免因为时区偏移导致规则不生效 - 逻辑标记不要写错:默认多个
RewriteCond之间是“与”关系,只有需要多条件满足任意一个时才加[OR]标记,标记错位会导致规则变成无差别封时段、或者全天封禁爬虫的错误效果 - 没必要全天封死Twitterbot:该爬虫的正常用途是抓取页面生成Twitter社交分享卡片,全天封禁会导致站点在Twitter的链接分享无法正常显示预览内容,仅在爬虫异常发起请求的时段精准拦截即可。
内容的提问来源于stack exchange,提问作者Ral AMORES GONZLEZ
相关产品推荐
相关产品推荐

