先给结论:内容相同并不能让两个响应头等价。死链接检测里遇到这种分歧时,决定保留、改写还是退出,取决于差异出现在哪个响应头、这个响应头是否影响可索引与可访问,以及你能否让最终生效的那一个与页面真实状态一致。若差异只涉及缓存或内容协商的次要字段,保留原状通常代价更低;若差异涉及状态码、重定向或 robots 指令,改写或退出更稳妥。
同样一份 HTML,经两个入口返回时,一个带 200 OK,另一个带 301 或 404,这时内容相同只是表象。死链接检测工具若只看正文哈希,会把两者都判为“活着”,但抓取与索引侧看到的是不同信号。需要先确认差异头属于哪一类:
Location:直接改变资源身份与可访问结论,不能靠正文一致来抵消。X-Robots-Tag 与 meta robots:一个在响应头,一个在文档内,出现矛盾时以更严格的一方为准,改写前要确认哪一层真正生效。Content-Type、Content-Encoding、Vary:影响解析与缓存,不必然改变索引结论,但可能让同一 URL 在不同请求下呈现不同结果。Cache-Control、ETag、Last-Modified:多数情况下不改变“是否死链”的判断,却会影响复检时看到的是新响应还是旧副本。把差异头按上述分类后,保留与改写才有依据。若一上来就按正文相同处理,后续动作容易落在错误的层级上。
保留适用于差异不改变资源身份、也不改变抓取许可的情形。例如同一路径在带与不带 Accept-Encoding 时返回不同压缩形式,正文解压后一致,状态码同为 200,且没有互相冲突的 robots 指令。此时保留原状,代价主要是复检噪音:不同工具或不同请求头下可能给出不一致的“正常/异常”标签。
可执行动作:固定一组请求头做基线复检,把其余差异记录为“已知偏差”。若基线复检后状态码与 robots 指令仍一致,下一步应转向检查内链与站点地图中的引用是否指向同一最终 URL,而不是继续改响应头。这个动作的结果会决定你是在处理死链,还是在处理缓存与协商差异——两者的修复位置完全不同。
改写适用于差异头确实影响判断、但资源本身应当继续存在的情形。典型是同一内容有两个入口,其中一个返回 301,另一个返回 200:应让内链与站点地图统一指向最终返回 200 的那个地址,而不是让两个入口长期并存。另一个情形是响应头里出现 X-Robots-Tag: noindex,而文档内没有对应指令,此时要确认是有意屏蔽还是配置残留,再决定移除或补齐。
改写的前提是你能控制响应头来源,并且改动后能复检到生效。若无法控制,改写只是把问题从响应层推到文档层,矛盾依旧存在。代价是可能影响依赖旧入口的访问路径,因此改写后要复检内链、站点地图和外部引用,确认没有把可访问地址改成新的断点。
退出不是放弃页面,而是停止把该 URL 当作可索引目标。适用条件包括:两个入口长期返回互相冲突的状态码,或 robots 指令与状态码组合导致既无法稳定抓取也无法稳定索引,且你无法在可接受成本内统一。此时应明确保留一个规范入口,其余入口按重定向或移除处理,并在死链接检测结果中标记为“已收敛”,避免后续复检反复报警。
需要克制的一点:抓取量下降、某次检测请求返回空结果,都不能单独证明处理正确。它们也可能是检测请求头变化、缓存命中或临时服务波动的结果。判断是否收敛,应看固定请求头下的状态码、robots 指令和最终 URL 是否稳定一致,而不是看单次统计的升降。
Location、X-Robots-Tag 与 Content-Type。假设某页面经 A、B 两个入口返回相同正文,A 为 200 且无 robots 限制,B 为 301 指向 A。按上述顺序,保留 A、把 B 视为重定向入口即可;若 B 返回 200 但带 noindex,则要先确认该指令是否有意,再决定改写还是退出。这个例子只说明比较方法,不代表任何真实站点的处理结果。