+1,三步法没问题,但真落地到服务器上,我会把「身份验证」拆成「官方 IP 段核对 + 正反查」两道,优先级排在 UA 前面。

具体做法:Googlebot 直接拉官方的 ipranges/googlebot.json(Bing 也有 bingbot.json),把 CIDR 灌进 nginx 的 geo/map 或 WAF 白名单,不在段内的一律按普通访客处理,UA 写字写得多像都不认。Baiduspider 没有官方 JSON,只能老老实实 dig -x 加正向回比。Facebook 可以用 whois -h whois.radb.net -- '-i origin AS32934' 拿它的网段。

有两个容易翻车的点:一是挂了 CDN 或反代时,$remote_addr 拿到的是节点 IP,正反查必然全错,得先确认日志里落的是真实回源 IP;二是 rDNS 查询建议指定 8.8.8.8/1.1.1.1,否则本地 DNS 污染会让验证结果随机漂移。

行为侧再补两条:Googlebot 现在不止一个 UA,还有 Googlebot-Image、Google-Read-Aloud、Storebot-Google,UA 不同但网段一致,别一刀切封掉;社交爬虫除了读 OG,通常还会拉一次 og:image,把这个当异常封了,分享卡片就全白。

最后提醒一句,验证通过不等于无限放行——真蜘蛛照样能把带宽打满,建议对 verified 流量也按 QPS 和访问深度设阈值,并且把验证结果按 IP 缓存(TTL 一天左右),不然每个请求都发一次 DNS 查询,响应会明显变慢。