先给结论:当同一批死链检查请求在多层缓存之间返回不同版本,最可能的一致性断点不在“死链本身”,而在某一层缓存对状态码、响应头或重定向结果做了独立存储。定位方法是固定一个可复现的请求,逐层剥离缓存,比较每层返回的状态码与关键响应头是否一致。但有一个反例会让这个结论失效:如果不同层之间的差异只出现在带查询参数的 URL 上,而同一路径的规范形式在各层完全一致,那么问题更可能出在缓存键设计而非缓存内容本身,此时逐层剥离会得到误导性的干净结果。
多层缓存返回不同版本,有两种成因需要先分开:一是同一缓存键在不同层存了不同响应;二是不同层对同一请求算出了不同的缓存键,导致各层命中的本来就是不同对象。区分证据是:对同一 URL 连续请求多次,如果某一层的结果在几个版本间来回跳,通常是缓存键或过期策略问题;如果某一层始终返回固定但与其他层不同的版本,更像是该层存了一份旧副本。死链检查场景下,旧副本常表现为某层仍返回 200,而源站已返回 404 或 410。
动作上,从最靠近源站的一层开始,逐层向外验证,而不是从浏览器端反向猜。每剥离一层,记录该层返回的状态码、Age、Cache-Control、ETag 或 Last-Modified,以及是否发生重定向。判断依据是:
Age 差异很大,说明是过期时间配置不一致,而非内容版本冲突。这一步的结果直接决定下一步:断点定位到某一层后,只需针对该层的缓存规则或清除策略处理,不必全链路重建;如果各层剥离后都一致,说明问题出在请求侧(如请求头、Cookie 或地区),应转向比较请求差异,而不是继续改缓存配置。
单次请求出现不同版本,不能直接归因于缓存不一致。以下现象都有其他合理解释:
要区分这些,需要固定请求来源、禁用跟随重定向、并在同一时间窗口内重复取样。假设一个例子:某路径源站返回 404,边缘缓存仍返回 200 且 Age 为 3600,而另一节点 Age 为 20 并返回 404——这组数据支持“边缘副本未过期”,但不支持“源站状态不稳定”。数字仅用于说明比较方法,不代表任何真实阈值。
如果差异只出现在大小写不同的路径、带尾斜杠与不带尾斜杠的变体、或带追踪参数的 URL 上,而规范形式在所有层都一致,那么逐层剥离会显示“各层都正常”,从而掩盖真正的问题:缓存键归一化规则不一致。此时继续按层排查会浪费时间,正确动作是先统一 URL 规范化规则,再重新检查。这类反例的适用条件是:差异可被 URL 形态而非缓存层解释。
定位到断点层后,先只对该层做一次有针对性的清除或规则调整,然后用同一组固定请求复测,确认返回版本收敛。若复测仍不一致,说明存在第二个断点或请求侧变量,应回到逐层比较而不是扩大清除范围。整个过程中,保持请求可复现比追求一次清干净更重要,因为只有可复现的请求才能证明某次调整确实改变了结果。