先给结论:当站长工具死链报告与页面实际状态对不上,而站点又存在 CDN、反向代理、应用缓存、对象缓存等多层结构时,问题通常不在“死链本身”,而在某一层缓存保留了旧版本响应。定位顺序应从离用户最远的一层开始,逐层固定输入、比对输出,直到找到第一个返回不一致的层。下面用一个假设情境把决策过程走完。
假设某站把 /old-page 改为 301 跳转到新地址,源站配置已更新,但站长工具仍报告该地址为软 404 或抓取异常。此时至少有三种解释,不能混为一谈:
关键动作是先确认源站真实响应,再逐层向外比对。如果源站就是错的,后面所有缓存排查都是白费;如果源站正确而外层错误,才进入缓存一致性排查。
不要用浏览器直接看,因为浏览器自身也有缓存,还可能带上你登录后的 Cookie,导致拿到与爬虫不同的版本。改用不带 Cookie、不带缓存的请求,并把每一层的响应状态码、跳转目标和关键响应头记录下来。
判断依据是:第一个与源站不一致的层,就是问题层。如果源站返回 301,而 CDN 返回 200,说明 CDN 缓存了旧版本;如果源站和 CDN 都是 301,只有站长工具显示异常,那更可能是报告延迟或抓取路径不同。这个区分直接决定下一步:前者要处理缓存刷新,后者要等待或换验证方式。
多层缓存返回不同版本,很多时候不是“没刷新”,而是不同层用了不同的缓存键。常见遗漏条件包括:
Host 或协议缓存,导致 http 与 https 命中不同副本。Vary 头(如按 User-Agent 或 Accept-Encoding 区分),爬虫与普通用户因此命中不同版本。此时即使你反复刷新 CDN,问题仍会复现,因为被命中的是另一个缓存键对应的副本。实际动作是:核对各层缓存键规则和 Vary 头设置,让同一资源的缓存维度保持一致,再逐层刷新。若忽略这一步,刷新只会清掉其中一份,另一份继续返回旧版本。
刷新缓存后,不要只请求一次就下结论。建议在短时间内从多个入口各请求若干次,确认状态码、跳转目标和响应头都稳定一致。若仍出现偶尔不一致,说明还存在未统一的缓存维度,或某层有独立的过期时间。
需要提醒的是,站长工具里死链数量下降或抓取恢复正常,不能单独证明缓存处理正确。报告延迟、抓取频率变化、抽样范围调整都可能造成类似现象。更可靠的证据是:源站与各缓存层在固定请求下返回同一版本,并且这种一致性能持续一段时间。
如果各层响应已经一致,但站长工具仍显示旧结果,可以先用抓取测试确认工具当前拿到的版本,再决定是继续等待报告更新,还是通过提交新的站点地图等方式引导重新抓取。站点地图不保证收录,robots.txt 的抓取限制也不等于可靠的索引移除,这些都不能替代缓存一致性本身的修复。先把多层版本对齐,再谈报告和索引,顺序才不会颠倒。