遇到死链时,第一件容易踩坑的事,是把缓存返回的旧页面当成“链接还活着”。排除缓存假象的核心方法,是让请求带上明确的禁缓存头,并对比“带缓存请求”和“强制回源请求”两次结果。如果两次状态码、响应体或跳转目标不一致,说明你看到的很可能是缓存副本,不能据此判断死链是否已修复。
同一个URL出现“有时404、有时200”,可能来自不同层:浏览器本地缓存、CDN边缘节点缓存、服务器端页面缓存,以及搜索引擎自己的快照或索引缓存。它们的排查方式不同,判断结论也不同。
注意:搜索引擎的索引缓存和你的服务器缓存是两回事。即使服务器已经返回404,搜索结果里仍可能短暂显示旧标题或旧快照,这属于索引更新滞后,不是服务器缓存假象。
Cache-Control、Age、X-Cache、CF-Cache-Status 一类字段。出现 HIT 或较大的 Age,说明响应来自缓存节点,不能直接当作源站状态。Cache-Control: no-cache,或给URL临时加一个无意义查询参数(如 ?v=20240101)再请求。如果这时返回404、而原URL返回200,基本可确认是缓存层在返回旧内容。curl -I 或浏览器网络面板查看完整跳转。如果缓存返回301到新地址、回源却返回404,说明链接目标已经失效,缓存掩盖了真实状态。按“影响面 × 排查成本”排序,优先做这三步:
如果强制回源后仍返回404,就按真死链处理:设置301跳转到最相关的有效页面,或恢复内容。如果回源返回200而缓存返回404,则清理对应缓存节点并调整缓存规则,而不是去改链接。
假设某商品页 /p/123 在浏览器里显示正常,但用 curl -I 加禁缓存头请求时返回404。带缓存请求返回 X-Cache: HIT,回源请求返回 X-Cache: MISS 且状态码404。结论:该页在源站已删除,你之前看到的是CDN缓存的旧副本。此时应清理该URL缓存,并决定是恢复页面还是做301跳转,而不是继续等待缓存自然过期。
下一步:挑出你手上流量最高的3个疑似死链URL,分别做一次带缓存请求和一次强制回源请求,记录两次的状态码与跳转目标。两次结果一致,按真死链处理;不一致,先清缓存再复测。