要排除缓存造成的假象,核心做法是:不要只看浏览器或某个工具刚返回的 robots.txt 内容,而是把「请求时间、响应头、响应正文、请求来源」四项放在一起核对。如果响应头里的缓存标记、正文中的规则、以及你直接向源站请求得到的结果三者不一致,那么你看到的很可能就是缓存副本,而不是源站当前真正对外提供的 robots.txt。这个判断对「改了规则但工具仍显示旧内容」「抓取诊断说被屏蔽但实际已放开」这类问题尤其关键。
robots.txt 可能被多层缓存影响,排查时要逐层区分:
这四层的表现可能相同,但处理方式完全不同,所以不能看到「内容没变」就断言源站没更新。
最直接的验证方式是绕过缓存,直接向源站请求,并查看响应头。可以执行类似命令:
curl -sI https://example.com/robots.txt
重点看这几个响应头字段:
Cache-Control:是否带有较长的 max-age,或 s-maxage。Age:如果这个值大于 0,说明当前返回的是缓存副本,而不是刚生成的响应。Last-Modified 与 ETag:用来和源站文件的实际修改时间对比。X-Cache、CF-Cache-Status 等自定义头:不同 CDN 命名不同,出现 HIT 通常意味着命中缓存。判断结果:如果 Age 明显大于 0,或出现缓存命中标记,而你刚更新过文件,那么你看到的就是缓存假象。此时应先去刷新 CDN 缓存或等待其过期,再重新核对,而不是继续修改规则。
排除缓存假象时,容易混入另一个误解:以为 robots.txt 里的 Disallow 能移除已经被收录的页面。事实是,robots.txt 的抓取限制不等于可靠的索引移除。如果某页面已被索引,仅靠 robots.txt 屏蔽抓取,页面仍可能留在索引结果中,因为搜索引擎无法抓取内容来判断是否该移除。因此:
这两件事的判断信号不同:前者看抓取是否被拒,后者看索引结果是否消失,不要用同一个「缓存是否刷新」来验证两件事。
按下面的顺序操作,每步都有明确判断依据:
Age 和缓存状态标记。Age 归零或接近零。验收通过的信号是:源站请求返回的正文与文件一致、Age 为 0 或很小、无缓存命中标记,且换环境请求结果相同。只要其中一项不满足,就还不能排除缓存假象。
如果只能做一件事,就先执行带响应头的源站请求,看 Age 和缓存标记。这一步成本最低,却能直接区分「源站没更新」和「缓存没刷新」这两种完全不同的原因。确认是缓存问题后,再决定是刷新 CDN 还是等待过期,避免在规则本身上反复修改却始终看不到变化。
下一步:用一条带 -I 的请求记录当前 robots.txt 的响应头,把 Age、缓存状态和正文一起存档,作为后续对比的基线。