先看现象。上线 WAF 的第二天收录开始掉,日志里 Googlebot 的请求一半是 403。抓包发现蜘蛛发的 Accept 就是星号,而规则里配的是「Accept 不含 text/html 即拦截」,正好命中。

排查方向其实有限,先把可能性排一排。WAF 规则按浏览器习惯写,没考虑爬虫只发星号。还有一种是白名单只放行了带 Mozilla 前缀的 UA,新版爬虫 UA 没进名单。

还有一种情况,拦截动作是静默返回 403,蜘蛛不会重试,直接记为抓取失败。

另外,规则更新没有灰度,全量节点同一分钟生效。

先用蜘蛛 UA 发一次请求看会不会被拦

curl -s -o /dev/null -w '%{http_code}\n' -A 'Mozilla/5.0 (compatible; Googlebot/2.1)' https://www.example.com/

随后按 UA 统计近一天的 403 数量

grep 'Googlebot' /var/log/nginx/access.log | awk '$9==403' | wc -l

拉取官方 IP 段核对来源真实性

curl -s https://developers.google.com/static/search/apis/ipranges/googlebot.json | head -20

末了把

拦

怎么算真的好了,看的是同一批现象。放行后第二天日志里 Googlebot 的 403 归零,抓取量恢复到此前日均的九成,两周后掉下去的栏目页重新进索引。

这里还有个坑。WAF 规则永远先按 UA 和 IP 做白名单,再谈特征匹配,顺序反了就是拿收录换安全。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189