先冻结证据,再决定是否清缓存:对同一路径连续取三次响应,记录每次的Age、ETag、Last-Modified、Cache-Control、Vary和响应体摘要。若三次结果不一致,问题通常不在“缓存有没有生效”,而在多层缓存对同一份域名历史数据的版本判定不同。此时应先确认哪一层返回了旧版本,而不是直接刷新全部缓存。
假设一个场景:你维护的站点把域名历史相关的页面数据放在源站,前面有 CDN,再前面有反向代理或应用层缓存。抽查一个 URL 时,响应头显示新版本;换一个地区、换一个查询参数或换一个用户代理后,返回的却是旧版本。样本量小时看不出问题,规模化抓取或批量校验时例外开始出现。
这类矛盾常被误判为“缓存没刷新”。但真正要回答的是:不同层是否对同一个资源得出了不同的缓存键或不同的新鲜度判断。
源站、反向代理和 CDN 可能各自持有不同时间点的副本。源站已更新,但中间层仍按旧的 max-age 或 s-maxage 继续提供旧响应。此时不同层返回不同版本,是因为新鲜度窗口没有同时到期。
各层对 Vary、查询参数、Cookie 或请求头的处理不一致,导致同一逻辑资源被拆成多个缓存键。比如 CDN 把某个请求头纳入缓存键,而反向代理没有纳入,就会出现“同一 URL、不同版本”的稳定分裂,而不是随机过期。
先固定一个 URL,在同一时间窗口内从不同入口请求,并记录每一跳的响应头。可区分点如下:
Age 接近某个阈值后变为新版本,更偏向新鲜度窗口不同。这些现象只能作为定位线索,不能单独证明某一层处理正确。请求量、抓取量或某项统计归零,也可能由采集方式变化、过滤条件变化或样本选择造成,需要结合响应头和数据版本一起判断。
选一个出现例外的 URL,按“源站 → 反向代理 → CDN”的顺序各取一次响应,保存响应头与响应体摘要。若源站已是新版本,而中间层仍是旧版本,下一步应针对该层核对缓存键和新鲜度配置,而不是全量刷新。若源站本身就是旧版本,先修发布流程,再考虑缓存。
这个动作的结果会直接影响下一步:确认是新鲜度问题时,调整对应层的过期策略并观察同一 URL 的 Age 变化;确认是缓存键问题时,统一各层对 Vary 和查询参数的处理,再用同一组请求头复测。若无法区分,至少保留可复现的请求组合,避免把偶发差异当成全局故障。
上述方法适用于你能控制或观察多层缓存响应头的场景。若 CDN 或反向代理不暴露逐跳响应头,只能通过对比不同入口的响应体摘要来缩小范围,结论强度会下降。若站点使用 robots.txt 限制抓取,它不等于可靠的索引移除;站点地图也不保证收录。HTTPS 不保证安全无漏洞或排名。不同搜索引擎对缓存、抓取和索引信号的支持情况须分别核查。
因此,当个别样本成立而规模化后出现例外时,先把它当作“版本判定不一致”的定位问题,而不是直接当作缓存故障处理;只有拿到分层证据后,才决定清理哪一层、改哪一项配置。