先给有条件的结论:如果同一个 robots.txt 的 URL 在不同网络位置、不同协议层返回了不同内容,而你又无法确定哪一份是“当前生效版本”,那么定位一致性的关键不是继续改规则,而是先建立一份可核对的版本对照:把原始文件、各层缓存产物、最终响应三者的字节差异找出来。只有当差异能被稳定复现、且能对应到某一层缓存时,后续修改才有意义;如果差异无法复现,先不要动 robots.txt,因为它更可能是抓取路径或观测方式造成的假象。
robots.txt 是一个普通文本文件,但它从源站到爬虫之间可能经过 CDN、反向代理、对象存储、边缘函数或浏览器缓存。任何一层保留旧副本,都会让同一 URL 返回不同版本。此时你在源站看到的正确内容,和在某个节点看到的内容可能完全不同。
要区分“文件写错了”和“缓存返回旧版本”,可以比较三样东西:源站文件的字节内容、直接请求源站得到的响应、以及经过完整链路得到的响应。如果源站正确而链路错误,问题在缓存;如果源站本身就错,问题在写法或发布流程。
这里有一个容易失效的前提:如果 robots.txt 的响应头里带有较长的缓存时间,或者 CDN 配置为忽略查询字符串,那么你临时加参数刷新看到的“新版本”并不能代表爬虫会看到什么。这种情况下,参数刷新反而会制造“已经生效”的错觉。
不要只凭“看起来一样”下判断。下面这组动作能帮你把差异落到具体层:
Disallow: /private/,另一份没有,这比笼统说“内容不一样”更有用。假设一个场景:源站文件禁止抓取 /tmp/,但某个 CDN 节点返回的版本仍允许抓取。若直连源站正确、CDN 错误,且响应头显示该节点缓存未过期,那么可以合理判断这是缓存一致性问题,而不是 robots.txt 语法错误。这个例子只用于说明比较方法,不代表任何真实站点状态。
反之,如果源站直连和 CDN 返回的内容完全一致,但都缺少你刚加的那一行,那么问题更可能在发布环节:文件没有真正上传,或上传到了错误的目录。此时继续清缓存不会解决问题。
请求量、抓取量或某个统计归零,都不能单独证明 robots.txt 处理正确。抓取减少还可能来自站点整体更新放缓、爬虫调度变化、其他规则拦截或服务器响应异常。把这些现象直接归因于 robots.txt 改动,容易做出错误修复。
同样,看到不同版本时也要先排除观测偏差:
只有当差异稳定、可复现,并且能定位到某一层时,才能把它当作缓存一致性问题处理。否则,先统一观测方法。
如果证据指向缓存层,处理顺序通常是:先确认源站版本正确,再让缓存层失效或缩短缓存时间,最后重新从多个位置核对返回内容。这个动作的结果会直接影响下一步:如果刷新后所有节点都返回同一版本,说明问题在缓存过期策略;如果刷新后仍有节点返回旧内容,说明缓存层级不止一层,或者刷新操作没有覆盖到实际提供响应的那一层。
如果证据指向写法或发布层,就不要反复清缓存。应回到文件本身:检查规则是否写在正确的 User-agent 分组下,是否被更宽泛的规则覆盖,是否因为编码或换行导致解析异常。修改后重新走一遍“源站—链路—多节点”的对照,确认每一层都拿到同一版本。
需要提醒的是,robots.txt 的抓取限制不等于可靠的索引移除。即使所有缓存层都返回了正确的禁止规则,已经收录的页面也可能继续出现在结果中。这个事实不影响缓存一致性定位,但会影响你对“改完就消失”的预期。
这套顺序的价值在于:它把“哪个版本才对”变成“哪一层返回了哪个版本”。只要这一步清楚了,robots.txt 写法本身是否需要修改,就会变成一个可以验证的问题,而不是靠猜。