要排除缓存造成的假象,核心做法是让抓取请求带上明确的“绕过缓存”信号,并把返回内容与源文件逐字对比。假设你更新了 robots.txt,把 Disallow: /private/ 改成 Allow: /private/,但抓取工具仍显示旧的禁止规则——这既可能是缓存,也可能是文件没保存成功、CDN 未刷新、或抓取的是另一个协议版本。下面给出可执行的排查顺序。
同一个现象至少有三种解释,不能一上来就断定是缓存:
只有先确认第三种不存在,前两种的排查才有意义。
最直接的办法是在 URL 后追加一个无意义的查询参数,让缓存键发生变化。例如:
curl -s "https://example.com/robots.txt?cachebust=20240101"
如果带参数返回新内容、不带参数返回旧内容,基本可以定位为中间层缓存;如果两者都返回旧内容,问题更可能出在源文件或发布流程。判断依据是:缓存通常按完整 URL 作为键,查询参数不同就会回源。
注意,真实搜索引擎抓取 robots.txt 时一般不会带你的随机参数,所以这个方法只用于诊断,不能作为长期方案。
用 curl -I 查看响应头,重点关注:
Cache-Control 的 max-age 和 s-maxage:数值越大,中间层保留旧副本越久。Age:大于 0 说明当前响应来自缓存,而不是刚回源。ETag 或 Last-Modified:与源文件的实际修改时间对比,不一致就说明拿到的是旧版本。X-Cache 一类自定义头:命中时通常显示 HIT,回源显示 MISS,可作为辅助证据。如果 Age 持续增长而源文件已改,说明缓存未失效,需要在 CDN 或代理层主动刷新。
假设某站点把 Sitemap: 行从旧地址改成了新地址,但检测工具仍显示旧地址。按以下顺序执行:
curl -s "https://example.com/robots.txt?x=1",看是否返回新地址。Age 与 Cache-Control。常见错误是跳过第 1 步直接刷缓存,结果刷新后依旧没变,白白浪费一轮等待。
robots.txt 只控制抓取,不等于索引移除。即使新规则已生效,已收录的页面也可能继续出现在结果中,需要配合其他方式处理。Sitemap: 行只是提示,不保证收录。另外,不同搜索引擎对 robots.txt 的解析细节和缓存策略并不一致,应分别用各自的官方工具核查,而不是拿一个平台的结果推断全部。
下一步:固定一个带时间戳的抓取命令,在每次修改 robots.txt 后立即执行并记录返回内容与响应头,形成可对比的证据链。