定位这类一致性问题的关键,不是先猜哪一层缓存坏了,而是先固定一个可复现的请求样本,把每一层返回的版本标识记录下来,再逐层比对差异出现的位置。对高外链域名来说,旧页面往往同时存在 CDN 边缘缓存、反向代理缓存、应用层缓存和浏览器缓存,任何一层持有旧副本,都会让同一个 URL 在不同网络、不同时间返回不同内容。下面以你手里一个正在退出的旧页面为对象,给出可执行的处理顺序。
反复刷新会混入不同节点、不同 Cookie 状态和不同时间点,反而掩盖问题。你需要构造一个最小可复现样本:确定一个具体 URL、一组固定请求头、一个固定网络出口,并在短时间内连续请求多次。
Age、Cache-Control、ETag 或 Last-Modified,以及响应体的首段内容或内容哈希。Via、X-Cache、Server。如果多次请求返回的 ETag 相同但正文不同,说明版本标识本身不可信,比对要改用正文哈希。这个动作的结果决定了下一步是查缓存配置还是查回源内容。
一致性问题的价值在于定位差异产生的层,而不是确认“确实不一致”。建议按从外到内的顺序逐层取样本:
差异第一次出现的层,就是需要优先处理的对象。如果边缘层返回旧版本而源站前置层返回新版本,问题在边缘缓存;如果所有层都返回旧版本,问题在源数据或生成流程。这个判断直接影响你接下来是清缓存、改缓存键,还是改发布流程。
高外链域名的旧内容通常有历史传播,缓存键可能包含查询参数、语言、设备或 A/B 分桶变量。只清除主 URL 的缓存,往往留下带参数的变体继续返回旧版本。
要注意,robots.txt 的抓取限制不等于可靠的索引移除,它只约束抓取行为,不保证已收录版本消失;站点地图也不保证收录。把缓存清理和索引处理混为一谈,会让旧版本在搜索结果里继续存在。清理动作完成后,用同一组请求样本复测,确认每一层返回的版本标识已经一致,再决定是否进入监测阶段。
并非所有旧内容都要下线。如果页面中一部分仍然有价值,需要保留,那么一致性判断不能依赖“最后修改时间”,因为多层缓存的更新时间并不一致。
假设一个页面顶部是已失效的合作信息,底部是仍被引用的说明文档。你可以把两部分拆成不同 URL 或不同片段,让失效部分单独走短缓存或直接回源,保留部分继续走长缓存。判断依据是:失效部分更新后,边缘层是否在预期时间内返回新版本;保留部分是否仍能命中缓存而不频繁回源。这个假设例子说明,拆分处理比整体清缓存更容易控制一致性。
如果无法拆分,至少要给失效部分设置更短的 Cache-Control 并附带可验证的版本标识,每次发布时更新该标识。复测时确认旧标识不再被任何层返回,才算完成退出。
处理完成后,不要只看一次请求是否变新。用最初固定的请求样本,在多个出口、多个时间点复测,重点观察:
Age 是否在预期范围内增长,而不是长期停在某个大值。如果复测中旧版本再次出现,先确认是缓存重新写入还是回源内容回退,再决定是扩大清除范围还是修正发布流程。请求量或抓取量下降本身不能证明处理正确,它也可能来自抓取预算变化、链接失效或访问路径改变,需要结合版本标识一起判断。只有在多个出口、多个时间点都返回一致版本后,才适合把该页面移出重点监测清单。