先给结论:多层缓存下同一URL返回不同版本,通常不是“死链检测方法本身失效”,而是检测请求命中了不同缓存层。要定位一致性问题,先保留现有检测链路,再给每一层加可区分的标记,最后根据标记决定保留哪层、改写哪层、退出哪层。直接删掉缓存或放弃检测,往往把可定位问题变成不可复现问题。
常规做法是看到一次404或一次200就下结论。多层缓存场景下,这个动作不够。你需要让同一URL在短时间内被不同层分别响应,并记录每层返回的状态码、响应头和响应体摘要。
假设一个例子:源站返回410,边缘缓存仍保留旧200,浏览器本地又缓存了更早的301。三次检测可能得到三个结果。此时不能直接判定死链检测方法出错,因为三个结果对应三个不同的缓存层。
可执行动作:对同一URL连续发起三次请求,分别绕过浏览器缓存、绕过边缘缓存、直连源站。记录每层返回的状态码和关键响应头。如果三层结果不同,下一步不是修源站,而是先确定哪一层是权威版本。
定位到差异层后,你有三个方向,但不必同时做。
选择依据不是哪层“更正确”,而是哪层能被稳定观测。不能被观测的层,保留它只会让后续判断继续漂移。
定位一致性问题的关键动作,是让每层响应带上可区分标记。常见做法包括:在请求头中加入唯一标识,在响应头中检查缓存命中状态,在源站日志中记录回源请求。
假设你给检测请求加了一个自定义请求头,源站收到后返回一个响应头标记。如果边缘缓存命中,这个标记不会出现;如果回源,标记出现。这样你就能判断某次404是源站真实返回,还是边缘层缓存的旧结果。
这个动作的结果直接影响下一步:如果标记显示边缘层命中,你要处理的是缓存刷新;如果标记显示回源且源站返回404,你要处理的是源站内容或链接本身。两者对应的修复对象不同。
多层缓存下,检测频率过高可能让缓存层来不及同步,反而制造更多不一致版本。检测频率过低,又可能漏掉真实死链。取舍点在于:你的检测目标是发现源站死链,还是发现用户实际遇到的死链。
如果目标是发现源站死链,检测请求应尽量直连源站或绕过缓存,频率可以按内容更新节奏设定。如果目标是发现用户实际遇到的死链,检测请求应模拟真实访问路径,接受缓存层参与,但必须按层归档结果。
按层归档后,你会得到一张分布图:哪些URL只在源站失效,哪些只在边缘层失效,哪些在多层同时失效。这张图比单一状态码列表更能支持决策。此时再决定是否调整检测频率,依据是差异层的同步周期,而不是主观感觉。
如果经过标记和归档,你仍然无法稳定复现同一层的返回结果,或者某一层持续返回无法解释的版本差异,那么继续用这条链路做死链判定已经不可靠。退出不是放弃检测,而是把该层从判定依据中移除,改用可观测的层作为基准。
退出后要记录三件事:退出的是哪一层、退出前观察到的差异模式、退出后用什么替代。这样下次再出现版本不一致时,你能快速判断是否与已退出的层有关。没有记录的退出,等于把问题藏起来。
最后,不要用一次检测结果归零来证明问题已解决。请求量、抓取量或某项统计归零,也可能只是检测请求被缓存层拦截、检测频率降低或日志采样变化。先确认这些替代解释是否成立,再决定是否恢复原检测链路。