先给结论:当同一死链接在不同网络、账号或工具里返回不同结果时,不要从“哪个版本才是真的”开始争论,而要先确定每一层缓存各自保存了什么、按什么键命中、以什么条件失效。把读者手上的一个具体URL当作对象,逐层取样,才能把“死链接状态不一致”拆成可执行的处理顺序。
选择一条你怀疑已失效的URL,记录完整路径、查询参数、协议、主机名,以及你观察到的每个返回结果。不要只写“某页是死链接”,要写成可重复的请求描述:从哪个网络出口、带不带Cookie、是否跟随跳转、请求头是否声明语言或缓存指令。
一个假设例子:同一路径在办公网返回410,在手机热点返回200,在命令行工具里返回301。三个结果并不必然互相矛盾,它们可能命中了不同层级的缓存,也可能因为请求头不同而落到不同后端。
动作上,先建立一张最小记录表,每条只包含:请求条件、返回码、跳转目标、响应头中与缓存和校验相关的字段、取样时间。结果如何影响下一步:如果同一条件下结果稳定,问题更可能在缓存层;如果同一条件也漂移,优先级要转向源站或调度层。
第一类是内容缓存。CDN或反向代理按URL、查询参数、Vary头等键保存了旧响应,源站已经删除或改状态码,但边缘仍返回旧版本。可核对的证据是响应头里出现年龄、缓存命中标记或过期时间,且强制绕过缓存后结果改变。
第二类是状态码缓存。某些层会单独缓存301、404、410这类响应,甚至比正常内容缓存更久。表现是源站已恢复200,但部分节点仍返回旧状态码。证据是不同节点、不同地区返回码不一致,而直接回源请求一致。
第三类是应用或数据库层缓存。页面模板、路由表、重定向规则被缓存在进程或内存中,导致同一源站对不同入口给出不同跳转。证据是同一次请求链里出现两次跳转,且第二次跳转目标与数据库记录不一致。
先做对照请求,而不是直接清缓存。常见做法包括:加一个不会命中的查询参数、发送禁止缓存的请求头、指定回源请求头、从不同网络出口重复同一请求。每一步只改变一个变量,否则无法归因。
动作的结果如何影响下一步:若绕过缓存后仍返回旧版本,继续清边缘缓存没有意义,应转向源站路由、应用内存或发布流程;若绕过缓存后恢复正常,再决定是等待过期、主动刷新,还是修正缓存键与失效规则。
缓存一致性问题解决后,还要避免把“工具看到的状态”直接当成索引状态。robots.txt禁止抓取不等于可靠的索引移除,站点地图存在也不保证收录。某次抓取返回404或410,不能单独证明该URL已被处理;它也可能是抓取时刚好命中旧缓存,或工具没有跟随跳转。
可核对的证据应至少包含:源站回源结果、缓存绕过结果、正常网络结果,以及这些结果的时间顺序。若三者一致为410,才适合进入移除或清理流程;若仍不一致,先修缓存,不要急着提交删除。
这套顺序的价值在于:它不要求你先相信某一层的结果,而是让每个动作产生一个可区分下一步的证据。只有当源站、缓存和正常请求三者一致时,死链接的一致性问题才算真正收敛。