先别急着清缓存,把同一个 URL 在“源站、CDN、页面缓存、浏览器”四个位置各取一次响应,对比状态码、Content-Length、Last-Modified、ETag 和正文里一个只在该版本出现的标记字符串。如果四份响应不是同一份内容,问题就不在收录本身,而在缓存层之间的版本选择逻辑;先定位是哪一层返回了旧版本,再决定是改缓存键、改失效策略,还是改源站输出。
定位一致性问题的第一步是建立对照,而不是直接操作缓存。对同一个 URL 分别取:源站直连响应(绕过 CDN 和页面缓存)、CDN 边缘响应、应用层页面缓存响应、浏览器本地响应。每份记录四项:HTTP 状态码、响应头里的缓存标识、正文长度、以及一个能区分版本的标记——比如正文中某个只在最新模板里出现的字段值。
如果源站直连返回的是新版本,而 CDN 边缘返回旧版本,说明问题在 CDN 的缓存键或失效范围;如果源站直连本身就返回旧版本,那 CDN 只是忠实转发了旧内容,要往应用层页面缓存或对象缓存查。这一步的动作结果是:把“缓存坏了”这个笼统判断,收敛成“哪一层先返回旧版本”的具体结论,后续排查范围随之缩小到一层。
注意一个反直觉现象:不同层返回不同版本,并不等于缓存配置写错了。多层缓存各自有独立的过期时间和失效触发条件,在源站内容更新后的一段时间内,各层处于不同的刷新进度,出现版本不一致是正常过渡状态。真正要区分的是:这是过渡窗口内的暂时不一致,还是某一层长期不更新。
把版本差异归因之前,先列出三种成立条件不同的解释,再用证据区分:
三种解释对应完全不同的处理动作:第一种只需等待;第二种要统一缓存键规则;第三种要修复失效链路。如果跳过区分直接清空所有缓存,可能暂时消除症状,但缓存键或失效链路的缺陷仍在,下次更新会复现。
假设你已确认 CDN 边缘返回旧版本、源站返回新版本,且等待超过最长 TTL 后边缘仍是旧版本。此时可执行的动作是:对该 URL 发起一次定向失效(purge),然后立即重新取样边缘响应。
结果分两种走向:
这个动作的价值在于:一次定向失效加一次取样,就能把“失效没生效”和“键不匹配”这两个容易混淆的原因分开,避免在错误的层上反复操作。
缓存版本收敛之后,再检查抓取侧的表现。需要明确几点边界:robots.txt 的抓取限制不等于可靠的索引移除;站点地图不保证收录;HTTPS 不保证安全无漏洞或排名。这些与缓存一致性是不同层面的问题,不要用缓存修复去解释收录状态的变化。
如果此前抓取工具拿到的是旧版本,而旧版本恰好缺少某些内容或带有不同的状态码,那么抓取侧观察到的行为可能确实受缓存影响。但请求量、抓取量或某项统计归零,不能单独证明缓存处理正确——它也可能是抓取预算调整、站点整体响应变慢、或其他页面结构变化的合理解释。要确认因果关系,需要把缓存版本收敛前后的抓取记录按同一 URL 对比,看返回内容是否随之改变,而不是只看总量数字。
最后一步是把这次的缓存键规则、各层 TTL 和失效触发条件记录下来,作为下次出现版本不一致时的对照基线。有了基线,下一次就能直接判断差异是过渡状态还是配置缺陷,而不必从零开始取四份响应。