如何处理僵尸订阅阅读器的持续访问请求?
碰到这种僵尸阅读器反复请求已删除RSS订阅源的情况确实挺闹心的——占了近四分之一的流量,虽然单条请求消耗不大,但架不住量多,看着也头疼。结合你的场景,给你几个实际可行的解决思路:
把301重定向改成410 Gone状态码
你现在用的301是告诉阅读器“资源搬到别的地方了”,但僵尸阅读器可能根本不处理重定向,或者找不到新地址就死磕。而410是明确的“资源永久删除,不存在了”,规范的阅读器收到这个状态码后,大概率会取消订阅。
操作起来也简单,在Apache的.htaccess或者虚拟主机配置里,把原来的301规则改成返回410就行,比如:Redirect 410 /path/to/old-feed.xml。不过要注意,有些老旧或不规范的阅读器可能不吃这套,还是会继续请求,所以这个方法不一定能100%解决,但能过滤掉一部分合规的僵尸请求。针对高频爬虫做速率限制
从日志里你已经看到Feedburner、Feedfetcher是重灾区,那可以给这些特定的User-Agent加请求频率限制,减少无效请求的轰炸。比如用Apache的mod_rewrite或者mod_ratelimit模块,设置每分钟最多允许几次请求,超过就返回429(请求过多),同时告诉它们过段时间再试。
举个mod_rewrite的配置例子:RewriteEngine On # 匹配目标爬虫的User-Agent RewriteCond %{HTTP_USER_AGENT} ^FeedBurner [OR] RewriteCond %{HTTP_USER_AGENT} ^FeedFetcher # 避免循环重定向 RewriteCond %{ENV:REDIRECT_STATUS} ^$ # 设置速率限制标记 RewriteRule ^ - [E=RLIMIT:10] # 告诉爬虫1小时后重试 Header set Retry-After 3600 env=RLIMIT # 返回429状态码 RewriteRule ^ - [L,R=429]这个规则会限制这两类爬虫每分钟最多请求10次,超过就返回429,能有效降低它们的请求量。
返回空的合法RSS订阅源
如果你不想直接返回错误码,也可以生成一个内容合法但为空的RSS feed,里面加一句“该订阅源已永久关闭”的说明。这样阅读器拿到合法的feed后,可能会更新订阅状态,甚至有些会提示用户。这个方法比较温和,不会产生大量错误日志,但还是会有请求流量,适合不想让日志太难看的场景。佛系忽略(如果资源压力不大)
要是这些请求对服务器的CPU、内存消耗真的微乎其微,其实也可以选择不管。毕竟僵尸阅读器可能过段时间会因为自身的清理机制消失,或者服务器完全能扛住这部分流量。你可以先观察几天服务器资源使用率,如果没什么压力,就当是无害的噪音,不用额外折腾。
另外,建议你先选一个方案小范围测试,比如先给几个高频请求的订阅源改成410,看看日志里的请求量有没有下降,再决定要不要全面推广。
备注:内容来源于stack exchange,提问作者zip_000




