先不要急着清缓存或提交重抓。把同一个URL在“源站直连、CDN边缘、搜索抓取视角”三处各取一份响应,比较状态码、正文指纹和关键头部;如果三份不一致,问题在缓存层而不在索引层,此时提交重抓只会把错误版本再确认一次。正确顺序是:先固定一份基准版本,再逐层比对,最后才决定是否让缓存失效。
你手上有一个页面,搜索结果显示的标题或摘要与当前编辑内容不符。这时最容易犯的错是直接刷新CDN或提交重抓。更稳的做法是先取证,因为缓存一旦被清掉,不一致的现场就消失了,你无法再判断是哪一层返回了旧版本。
对同一个URL分别取三份响应:
Last-Modified、ETag和正文的哈希值。Age、Cache-Control、X-Cache这类缓存命中标记。把三份正文各算一个指纹(例如对正文做哈希)。三份指纹相同,说明缓存一致,问题在索引更新滞后;两份相同一份不同,不同的那一层就是嫌疑层。这个动作的结果直接决定下一步:指纹一致就去查索引侧,指纹不一致就留在缓存侧排查,不要跨层猜。
指纹不同还要再分一次,因为两种不一致的处理代价完全不同。
版本落后:边缘返回的正文是旧版,但结构、字段、链接都和源站一致,只是内容旧。典型证据是Age较大、源站Last-Modified比边缘的新。这种情况属于TTL没到或失效没传播,处理成本低。
内容分叉:不同层返回的不只是新旧差异,而是结构不同——比如边缘版本缺少某个区块、多出一段注入内容、或状态码从200变成404。这类问题往往来自缓存键设计、UA分流规则或中间层改写,不是等TTL过期就能自愈的。
判断依据可以看Vary头:如果源站声明按UA或Cookie分流,而缓存键没有覆盖这个维度,就会出现同一URL对不同请求者返回分叉内容。这时搜索抓取看到的版本可能和你浏览器看到的完全不同,而你在浏览器里怎么刷新都复现不了。
假设一个场景:源站对移动UA返回精简版,对桌面UA返回完整版,缓存层却只用URL做键。结果是先到的那个版本被缓存,之后所有请求者都拿到它。搜索抓取如果恰好命中精简版,索引里就会缺少完整内容。这是假设例子,用来演示比较方法,不代表任何真实站点。
复现步骤是:
Vary: User-Agent,以及缓存层是否真的按该头分键。如果源站声明了Vary但边缘没分键,修复点在缓存配置;如果源站根本没声明Vary却按UA返回不同内容,修复点在源站。这个区分决定了你该找谁改,而不是两边都改一遍。改完后重复上面的三份取证,指纹一致才算这一步收尾。
两种做法都成立,但条件不同。
选择失效缓存:当确认边缘返回的是旧版本、且源站已是最新正确版本时。代价是失效瞬间回源压力上升,如果源站扛不住并发回源,可能触发限流甚至短暂不可用。适用条件是源站已验证稳定、且你能控制失效范围(单URL优先于全站)。
选择等待自然过期:当TTL本身很短、或你不确定源站是否已经是最终版本时。代价是错误版本会继续被返回一段时间,期间搜索抓取可能再次确认它。适用条件是你已经确认源站正确、且能接受这段延迟。
判断的关键不是哪个更快,而是源站是否已经是你想要的那一版。源站没改对就失效缓存,只会把同样的错误重新缓存一遍,还多消耗一次回源。所以动作顺序是:先确认源站正确,再决定失效范围,最后才提交重抓。
缓存一致之后,再看收录状态才有意义。如果三份指纹已经一致、状态码稳定为200、正文包含目标内容,但搜索结果仍显示旧版本,那属于索引更新节奏问题,不是缓存问题,继续清缓存没有帮助。
反过来,如果指纹一直不一致,那么无论提交多少次重抓,搜索抓取拿到的都可能是分叉版本,收录状态自然对不上。此时优先级是修缓存键或Vary配置,而不是反复提交URL。robots.txt限制抓取不等于能可靠移除已收录内容,站点地图也不保证收录,这两点在这类排查里只作为背景,不构成解决方案。
一个可执行的收尾标准:连续两次在不同时间点取证,三份指纹都相同,且边缘的Age在合理范围内重置,才认为缓存层已经稳定,此时再观察收录状态的变化才有参考价值。