结论有条件:如果两处地址返回的正文内容一致,但响应头不同,死链检测方法不能只看内容是否相同,必须把状态码、缓存指令和重定向链分别核对。只有当响应头也一致或差异可解释时,才能把其中一处判为可安全退出的旧入口;否则应保留观察,先查清差异来源。一个反例是:内容相同且都返回 200,但 A 带 Cache-Control: noindex 或 X-Robots-Tag: noindex,B 不带,此时把 B 当作 A 的替代并不成立,因为两者对抓取方的可见性不同。
正文一致只说明用户看到的主体信息接近,不说明处理逻辑一致。响应头里至少有三类字段会直接改变判断:状态码、重定向相关字段、以及抓取与缓存指令。
Location 指向哪里、是否形成多跳、是否回到原地址,决定该入口是正常收敛还是循环。X-Robots-Tag、Cache-Control、Vary 等字段会改变抓取方和中间缓存对该地址的处理方式。因此,同一份正文出现在两个响应头不同的地址上时,至少有两种成立条件:其一,两处都返回 200 且抓取指令一致,差异仅在缓存时长,这时可以按同一份内容处理,把其中一处标记为待退出;其二,一处带 noindex 或指向别处,另一处不带,这时“内容相同”不能作为合并或删除的依据。判断前先分别记录两处的完整响应头,再决定下一步。
可解释的差异通常有明确来源。例如旧系统统一加了较短的缓存时间,新入口由另一层网关返回较长缓存时间;或者旧入口多了一个用于内部统计的响应头。这类差异不改变状态码和抓取指令,内容又确实一致,可以继续按“同一内容、两个入口”处理。
会推翻结论的差异集中在三处:
X-Robots-Tag 只出现在其中一处。遇到这三类情况,不能因为正文相同就判定“旧地址可以下线”。更稳妥的动作是:把两处地址分别作为独立对象登记,标注各自的状态码、重定向目标和抓取指令,再判断哪一个才是真正需要保留的入口。这个动作会直接影响后续清理范围——如果误把仍带抓取限制的地址当成正常入口保留,清理后可能留下一个不会被正常处理的地址;如果误把正常入口当成旧地址删除,则可能切断仍被引用的路径。
假设某站点有两个地址 A 和 B,正文完全一致。A 返回 200,带 Cache-Control: max-age=3600;B 返回 301,Location 指向 A,且 B 不带抓取限制。此时不能把 A 和 B 都当作“内容重复”直接删掉一个。正确顺序是:先确认 B 的 301 是否长期稳定,再确认 A 是否可正常抓取,最后检查站内和外部引用分别指向谁。若引用主要指向 B,直接把 B 下线会让这些引用进入跳转或失效状态;若引用主要指向 A,B 可以保留跳转并逐步替换引用。
反过来,如果 A 返回 200 且带 X-Robots-Tag: noindex,B 返回 200 且不带该字段,那么“内容相同”只说明正文接近,不说明两者等价。此时把 B 当作 A 的替代、或把 A 当作可删除的旧页面,都缺少依据。下一步应是查清 noindex 是历史遗留还是有意设置,再决定保留哪一个。
死链检测方法在这里的关键不是多抓一次正文,而是把响应头当成独立证据。具体动作可以这样安排:
Location、X-Robots-Tag、Cache-Control。需要提醒的是,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。若响应头差异涉及抓取限制,不要用“已加入站点地图”或“已写进 robots.txt”来替代对响应本身的核对。把响应头差异查清后再决定保留、跳转还是退出,才能让下一步的清理范围有据可依,而不是靠正文相同这一条线索推断。