响应头不同会直接影响三类判断:这条URL是否真的失效、它是否值得继续保留在链接体系中、以及修复动作应该落在哪一层。内容相同只能说明“看起来一样”,不能说明状态码、缓存策略、跳转链路和抓取限制相同。下面用一个明确标为假设的情境,把判断顺序和不能照搬的边界拆开。
假设某个栏目改版后,旧地址 /old-a 与新地址 /new-a 返回的正文完全一致,肉眼和抓取到的可见文本也一致。但旧地址返回 200,新地址返回 301 指向旧地址,或者反过来。此时“内容相同”只描述渲染结果,不描述协议层行为。
需要分别记录的最小字段是:状态码、Location(如果有)、Cache-Control、X-Robots-Tag(如果有)、以及正文是否由同一份模板输出。缺少这些字段,就无法判断两个地址是不是同一个资源的两种表达。
这里有一个常见误判:看到两个地址正文一致,就认为其中一个可以随意删除。删除动作影响的是链接入口和外部引用,不是正文本身。正文相同不代表链接价值相同,也不代表抓取预算的消耗方式相同。
如果旧地址返回 404 或 410,而另一个内容相同的地址返回 200,那么对用户和抓取来说,前者是失效地址,后者是有效地址。内容相同不能把 404 洗成有效。反过来,如果旧地址返回 301 指向新地址,它就不是死链,而是一条需要观察的跳转链路。
实际操作:先对样本地址逐个请求并记录状态码与跳转终点,再决定是否把它列入死链清单。这个动作的结果会决定下一步是修链接、改跳转,还是什么都不做。
如果两个地址正文一致,但一个带 noindex 类响应头,另一个没有,那么“内容重复”不是主要问题,索引指令冲突才是。此时修改正文不会解决判断分歧,需要先统一索引指令。
如果两个地址都返回 200 且都没有索引限制,那么重复内容更可能影响的是规范化选择,而不是死链判定。这两类问题的修复位置不同:前者动响应头,后者动内容或链接指向。
假设你在排查时看到旧地址返回 200,但另一个工具看到 404。差异可能来自 Cache-Control 或中间缓存层,而不是源站逻辑变化。此时不能直接下结论说“死链已经恢复”或“死链仍然存在”。
可区分的证据是:带缓存绕过参数的请求与不带参数的请求是否返回同一状态码;同一时间点不同网络位置的请求是否一致。如果两者不一致,先处理缓存判断,再处理死链判断。
个别样本成立,不代表批量成立。常见例外有三类:
301,部分返回 302,还有部分返回 200 但带索引限制。样本只覆盖了其中一种。robots.txt 中,工具无法取到真实响应,于是把“未取到”误记为死链。抓取限制不等于索引移除,也不等于地址失效。因此,样本结论只能用于确定排查字段,不能直接作为批量处理规则。批量处理前需要先跑一轮全量状态码分布,确认例外比例和例外类型。
这套顺序的作用是避免把“内容相同”当成“行为相同”。内容相同只减少了一类变量,响应头差异仍然会改变死链判定、修复位置和批量规则。站点地图不保证收录,HTTPS 也不保证安全或排名,这些都不能替代对响应头的实际核对。
如果两个地址的正文相同但分属不同域名或不同站点,响应头差异可能来自完全不同的服务配置,此时不能按同一站点的规则处理。如果地址本身带参数且参数影响响应,正文相同可能只是默认参数下的巧合,需要先固定参数再比较。
另外,如果抓取工具无法取到真实响应,只能看到抓取限制或超时,那么状态码记录本身不可靠。此时应先解决可达性,再谈死链判断。可达性未确认之前,任何批量修复都可能作用在错误对象上。
最后,响应头不同不必然意味着需要统一。如果两个地址面向不同入口、不同用户群或不同缓存策略,保留差异可能是设计结果。判断标准不是“是否相同”,而是“差异是否影响失效判定、索引选择和链接维护”。只有影响这些判断时,才需要进入修复流程。