先别急着改规则:把 CDN、反向代理、应用层和本地浏览器这四层缓存的响应逐一取出,对比 robots.txt 的正文、状态码和关键响应头,找出哪一层最先偏离源站,再决定清理顺序。一致性问题的根源通常是某一层缓存了旧文件、或者各层对同一路径给出了不同重写结果,而不是规则内容本身写错了。
多层缓存不一致时,最容易犯的错是拿浏览器看到的版本当基准。浏览器还叠了本地缓存和 Service Worker,它的结果不能代表源站。正确顺序是绕开所有缓存直连源站,拿到那份文件作为基准,记下它的正文摘要、字节数和修改时间。
具体动作:用带随机查询串的请求直连源站,例如 curl -s "https://example.com/robots.txt?nocache=1",保存输出。这一步的结果决定后面所有比较的参照物——如果源站本身就在两个版本之间摇摆,问题不在缓存层,而在发布流程,后续排查方向要整体换掉。
拿到源站基准后,按请求路径从外到内逐层取样,每一层都记录三样东西:正文、HTTP 状态码、以及 Cache-Control、Age、ETag 这类能说明缓存行为的响应头。判断依据是“哪一层开始与源站不一致”,而不是“哪一层看起来最新”。
如果只有部分 CDN 节点返回旧版本,说明是边缘缓存未失效;如果所有节点都返回旧版本而反向代理是新的,问题集中在 CDN 到源站之间的缓存键或回源配置上。这一步的取样结果直接决定下一步是清缓存还是改回源逻辑。
同样是“版本不同”,成因不同,处理动作也不同。可以用下面的证据组合来区分:
Cache-Control 是长缓存,但某层按短缓存处理,导致同一时刻各层新旧不一。证据是各层 Age 差异明显。第三种情况最容易被误判成“规则写错了”。如果手动清理一个节点后它马上返回新版本,就说明规则内容没问题,缺的是失效流程,下一步应该去补发布环节的清理动作,而不是改 robots 内容。
把上面的判断落成动作,顺序不要颠倒:
Age、缓存键、手动清理后的变化,判断属于过期策略、缓存键还是失效遗漏。需要提醒的是,抓取限制的生效与否和索引结果不是一回事,robots.txt 的变更也不等于可靠的索引移除;即使各层版本最终一致,也不代表抓取或收录会立刻按预期变化。一致性排查解决的是“各层看到的是不是同一份文件”,这个前提确认清楚之后,再去看抓取与索引层面的现象才有意义。