先承认一个事实:你看到的 robots.txt 不一定是搜索引擎看到的那个。静态文件返回的是一段纯文本,而某些站点会在边缘节点或中间件里用脚本改写响应。当两者不一致时,不要急着改规则,先把“谁在什么条件下生成了哪一版内容”固定下来,再决定是修文件、修渲染逻辑,还是修缓存。
把问题拆成三个可分别验证的层,比反复刷新页面有效得多。
动作上,先直接读取源文件内容,再发起一次带明确 UA 的请求,把两段文本逐行比对。结果分两种:如果源文件与响应一致,差异就出在缓存或请求条件上;如果源文件与响应不一致,问题在中间件或脚本改写。这一步决定了后面查缓存还是查代码,方向完全不同。
脚本渲染的结果往往依赖请求特征。你可以构造一组对照请求,只改一个变量,看响应是否随之变化。
如果只有换 UA 才出现差异,说明中间件按爬虫身份做了分支;如果绕过缓存后差异消失,说明是缓存把某一版结果固化;如果换 IP 才不同,说明存在地域或节点级的分流。这三种证据指向三种不同的修复位置,不能混为一谈。
假设某站点源文件里写的是 Disallow: /search,但响应中变成了 Disallow: /。用上面的对照法发现:普通浏览器 UA 拿到源文件内容,某个爬虫 UA 拿到全站禁止。可推断中间件按 UA 做了改写。
此时要做的不是删掉源文件里的规则,而是定位那段改写逻辑,确认它是有意为之还是历史遗留。如果是有意限制某类爬虫,应把它写成独立、可读的规则;如果是误伤,直接移除该分支。改完后重新发起同一组对照请求,确认所有 UA 拿到一致结果,再进入下一步。
响应统一之后,还要区分“抓取限制”和“索引移除”这两件事。robots.txt 里的禁止规则只约束抓取行为,不等于让已收录页面从结果中消失;如果目标是移除索引,需要的是页面级 noindex 或其它移除手段,而不是在这里加规则。
验证顺序建议是:先确认所有请求条件下返回同一份内容,再确认状态码和内容类型正常,最后才去观察抓取与索引数据的变化。要注意,抓取量或某项统计归零,并不能单独证明处理正确——它也可能是抓取预算调整、站点整体流量变化或日志采样口径改变造成的。把这些替代解释一并列出,才不至于把相关当成因果。
差异定位完成后,留下三个可复查的锚点:源文件的预期内容、一组固定的对照请求、以及响应应满足的条件。下次再出现静态与渲染不一致时,直接跑这组请求即可判断是回归还是新问题。
同时要接受一个现实:不同搜索引擎对 robots.txt 的解析和支持范围并不完全一致,某些非标准写法在一处生效、在另一处被忽略。因此修复后应分别核查主要搜索引擎的实际抓取行为,而不是用一次请求的结果推断全部。站点地图的存在也不保证收录,它只是发现 URL 的辅助信号,不能替代对响应一致性的验证。
最终判断标准很朴素:在你能控制的请求条件下,robots.txt 的响应应当稳定且与源文件意图一致;一旦出现分叉,就先定位分叉发生在文件、中间件还是缓存,再决定改哪里。