当你把旧系统的一部分内容迁移到新主机或新域名后,发现同一页面在不同网络、不同入口下返回了不同版本,先不要急着改代码。多数情况下,问题出在多层缓存各自保存了不同时间点的副本,而不是源站内容本身出错。定位的起点是:把“用户看到的版本”和“源站真实输出”分开验证,再逐层向上游排查。
在动任何缓存配置之前,先绕过所有中间层,直接向源站请求目标资源。假设你的主机域名选择方案是保留旧域名做跳转、新域名承载内容,那么源站请求应带上明确的 Host 头,并关闭本地浏览器缓存。
这一步的实际动作是建立一条“请求路径链”。每多一层,你就多一个可对比的样本。结果会直接决定下一步:源站不稳就先修应用,源站稳定才继续查缓存。
多层缓存返回不同版本,常见原因是各层的过期时间、缓存键和清除机制不一致。你需要分别确认每一层是否缓存了目标资源,以及它的缓存键包含哪些维度。
这里的关键不是记住所有缓存类型,而是对每一层问两个问题:它缓存了什么,它凭什么判断这是同一个资源。两个答案不一致,就会产生版本分裂。
假设你正在处理一批旧页面:一部分要下线,一部分仍有访问价值。多层缓存不一致会让“下线”变得不可靠,因为旧版本可能仍被某一层返回。
一个可执行的判断是:如果同一 URL 在清除所有缓存后仍返回旧版本,问题不在缓存,而在源站或数据副本。这时继续清缓存只会浪费时间,应转向检查应用输出和数据同步。
反复刷新页面得到的结论通常不可复查,因为每次请求可能命中不同层。更可靠的做法是固定请求条件并记录结果。
如果三组样本中只有一组不同,问题范围就缩小到那一层。如果三组都不同,说明源站输出本身不稳定,缓存只是把差异暴露出来。这个结果会影响下一步:是调整缓存策略,还是先修复源站的一致性。
请求量下降、抓取量变化或某个入口暂时返回新版本,都不能单独证明缓存问题已经解决。它们可能有其他解释,比如网络路径变化、请求头差异或副本同步延迟。把一次观察当作结论,容易在下一层缓存再次返回旧版本时失去方向。
另外,用抓取限制文件阻止访问,并不等于可靠地移除已缓存或已索引的内容;站点地图的存在也不保证各层会按你预期的时间更新。这些手段可以作为辅助,但不能替代逐层验证。只有当你能够稳定复现“源站输出一致、各层缓存键一致、清除后不再返回旧版本”时,才可以把一致性问题视为已定位并处理完毕。