先做一件事:把你在浏览器、CDN 边缘节点和源站分别取到的 robots.txt 响应体保存成三个文件,用校验和比对内容,而不是只看状态码。如果三者不一致,问题几乎一定出在缓存层,而不是 robots.txt 语法本身。此时不要急着改规则,先确定哪个版本才是源站真实版本,再决定是清缓存、改缓存策略,还是调整发布流程。
多层缓存场景下,同一路径可能经过浏览器缓存、CDN 边缘缓存、反向代理缓存,最后才到源站。它们返回不同内容,有两种完全不同的原因。
判断方法很简单:在源站直接请求该路径,连续请求多次并带上不同 Host 头,看内容是否变化。如果源站自身就返回多个版本,清缓存不会解决问题,下一步应该收敛源站逻辑,而不是反复刷新 CDN。
不要依赖浏览器地址栏,它受本地缓存和 Service Worker 干扰。用命令行工具逐层取样,并记录响应头中的缓存相关字段。
ETag、Last-Modified、Cache-Control。sha256sum,用哈希值判断是否同一版本,避免肉眼漏看空格和换行差异。如果正式域名与边缘节点一致、但与源站不同,问题在边缘缓存;如果边缘节点之间互相不同,说明缓存键设计或节点回源策略有差异;如果三层都一致、只有某个地区或某个 UA 拿到旧版本,那更可能是源站分流或中间设备改写。
robots.txt 与普通静态资源不同:它没有强制的短缓存期限,抓取方可能长时间沿用自己缓存的副本。这意味着即使你修好了各层缓存,外部抓取方仍可能在一段时间内按旧规则行动。因此定位一致性问题的目标不是“让所有层立刻一致”,而是先确认源站版本正确,再控制缓存寿命。
一个常见误区是:把 Disallow 改成允许,就以为旧内容马上会退出。抓取限制不等于可靠的索引移除,旧页面是否消失取决于抓取方重新读取规则并重新处理,这中间有延迟。所以缓存排查和索引结果排查要分开做,不能因为某个页面还在结果里就断定 robots.txt 没生效。
假设某站点在迁移后,源站 robots.txt 已改为允许抓取新目录,但正式域名仍返回旧版 Disallow: /new/,而某个边缘节点返回的是更早的、连站点地图声明都没有的版本。此时可以这样处理:
这个动作的结果会直接决定下一步:如果刷新后所有层都收敛到基准版本,问题属于缓存过期;如果刷新后差异仍在,就要回到源站分流逻辑去查,而不是继续刷缓存。
验证时至少覆盖三类取样点:源站、边缘节点、正式域名,并分别在刷新前后各取一次。比对内容用哈希,比对缓存行为看响应头。不要用“抓取量突然归零”或“日志里请求变少”单独作为判断依据,这些现象也可能来自抓取方自身调整、站点整体流量变化或日志采集问题。
如果同一问题在多次发布后反复出现,说明症结在发布流程:robots.txt 的更新没有触发缓存失效,或者不同环境使用了各自的缓存策略。此时合理动作是把 robots.txt 纳入与其他关键配置相同的发布与失效流程,并保留每次变更的版本记录,而不是每次靠人工刷新救火。
最后提醒一点:不同抓取方对 robots.txt 的缓存和解析行为并不一致,支持情况需要分别核查。你无法通过一次缓存排查让所有抓取方同时按新版本行动,但可以确保源站正确、各层可控,并把残余延迟当作已知条件管理。