当同一个失效地址在浏览器、CDN 和源站分别返回不同结果时,先不要把它当成单一死链处理。更快的做法是固定一个失效 URL,逐层记录状态码、响应头和正文特征,找出哪一层开始出现分叉;分叉点通常就是修复入口,而不是继续在源站反复改规则。
假设某站点把旧产品页 /p/old-model 下线,源站已返回 410,但运营人员在浏览器仍看到 200 的旧页面,在 CDN 边缘节点看到 301 跳转到新页,在另一台回源测试机上又看到 404。此时不能简单判断“死链没修好”,因为三层返回的是三种不同语义:410 表示资源已永久移除,301 表示地址已迁移,404 表示未找到。它们对应的后续动作不同,混在一起排查会反复改错地方。
这个情境的关键前提是:站点已有 CDN 和至少一层应用缓存,且近期做过页面下线或 URL 规则调整。如果站点没有多层缓存,或者失效 URL 只出现在站内搜索的旧链接里,下面的分层方法仍可用,但分叉点通常更少。
定位一致性问题的第一步是固定观察对象。选一个具体失效 URL,不要用首页或栏目页代替。然后按由外到内的顺序取证据:
cache-control、age、x-cache 等缓存指示字段,以及页面正文是否仍是旧内容。三层都取到后,比较“状态码 + 正文特征 + 缓存指示字段”三组信息。只要其中一组不同,就说明该层之前的缓存或规则没有和源站对齐。实际动作是先记录分叉层,再决定下一步是清缓存、改规则还是改源站逻辑;如果不记录就清缓存,很可能只是暂时掩盖分叉,下一次回源又会出现。
多层缓存返回不同版本,常见原因可以归为三类,它们的证据不同,处理顺序也不同。
如果源站已返回 410,但 CDN 边缘仍返回 200 旧页面,并且响应头里带有较长的缓存有效期或较大的 age,优先怀疑边缘缓存未失效。此时应检查该 URL 的缓存键是否包含会变化的查询参数或请求头,以及下线操作是否同步触发了缓存刷新。动作上先对单个 URL 做定向刷新,再重新从边缘取一次证据;如果边缘恢复为 410,说明分叉点在缓存层,后续要补的是下线流程中的刷新步骤,而不是继续改源站。
如果源站返回 410,但绕过 CDN 后仍看到 301,说明分叉点在应用层或反向代理。常见情况是旧 URL 同时命中了迁移规则和失效规则,先执行的规则决定了返回结果。此时应查看规则匹配顺序,而不是只看规则是否存在。动作上把同一 URL 的规则匹配结果打印出来,确认哪条规则先命中;如果迁移规则优先,就要决定是保留迁移还是改为失效,这个决定会直接影响后续是否需要清理站内旧链接。
如果同一层在不同节点返回不同结果,例如部分边缘节点返回 404、部分返回 200,可能是节点缓存状态不同,也可能是应用多实例部署了不同版本。证据上要看返回头中的节点标识、应用版本标识或部署时间字段。动作上先确认差异是否集中在少数节点;如果是,先对这些节点做定向刷新或重新部署,再复测。若差异随节点数量扩大,则要回到发布流程检查灰度或回滚是否完整。
为了减少来回试错,可以按下面的顺序推进,每一步的结果决定下一步:
这个顺序的价值在于:它把“死链修复”从批量替换或全站刷新,收缩到具体分叉层。对已有业务站点来说,全站刷新可能影响正常页面的缓存命中,而定向处理只影响被确认分叉的 URL,风险更可控。
当三层返回一致后,不要立刻认为问题结束。需要确认几个前提:下线规则是否只对目标 URL 生效,缓存刷新是否覆盖了边缘和浏览器两层,以及站内旧链接是否仍指向该地址。这里要特别注意,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录;如果失效 URL 仍被站内或其他页面链接,即使当前返回一致,后续仍可能因为抓取或跳转再次出现不同版本。
另外,HTTPS 不保证安全无漏洞或排名,它和本次缓存一致性问题没有直接因果关系,不应作为排查主线。真正需要保留的证据是:同一 URL 在三层的状态码、正文特征和缓存指示字段。只要这三组证据能稳定复现,后续无论换人排查还是交给开发处理,都能从分叉层继续,而不是从头猜测。