死链接检测:页面内容相同但响应头不同时保留还是改写

📍 WDQWDWQD987AAAAA:216.73.216.245
📱 Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
🔗 /d5536eeb9c24.html
📄

死链接检测:页面内容相同但响应头不同时保留还是改写

先给结论:内容相同并不能让两个响应头等价。死链接检测里遇到这种分歧时,决定保留、改写还是退出,取决于差异出现在哪个响应头、这个响应头是否影响可索引与可访问,以及你能否让最终生效的那一个与页面真实状态一致。若差异只涉及缓存或内容协商的次要字段,保留原状通常代价更低;若差异涉及状态码、重定向或 robots 指令,改写或退出更稳妥。

先分清差异头是否参与可索引判断

同样一份 HTML,经两个入口返回时,一个带 200 OK,另一个带 301 或 404,这时内容相同只是表象。死链接检测工具若只看正文哈希,会把两者都判为“活着”,但抓取与索引侧看到的是不同信号。需要先确认差异头属于哪一类:

把差异头按上述分类后,保留与改写才有依据。若一上来就按正文相同处理,后续动作容易落在错误的层级上。

保留原状成立的条件与代价

保留适用于差异不改变资源身份、也不改变抓取许可的情形。例如同一路径在带与不带 Accept-Encoding 时返回不同压缩形式,正文解压后一致,状态码同为 200,且没有互相冲突的 robots 指令。此时保留原状,代价主要是复检噪音:不同工具或不同请求头下可能给出不一致的“正常/异常”标签。

可执行动作:固定一组请求头做基线复检,把其余差异记录为“已知偏差”。若基线复检后状态码与 robots 指令仍一致,下一步应转向检查内链与站点地图中的引用是否指向同一最终 URL,而不是继续改响应头。这个动作的结果会决定你是在处理死链,还是在处理缓存与协商差异——两者的修复位置完全不同。

改写成立的条件与代价

改写适用于差异头确实影响判断、但资源本身应当继续存在的情形。典型是同一内容有两个入口,其中一个返回 301,另一个返回 200:应让内链与站点地图统一指向最终返回 200 的那个地址,而不是让两个入口长期并存。另一个情形是响应头里出现 X-Robots-Tag: noindex,而文档内没有对应指令,此时要确认是有意屏蔽还是配置残留,再决定移除或补齐。

改写的前提是你能控制响应头来源,并且改动后能复检到生效。若无法控制,改写只是把问题从响应层推到文档层,矛盾依旧存在。代价是可能影响依赖旧入口的访问路径,因此改写后要复检内链、站点地图和外部引用,确认没有把可访问地址改成新的断点。

退出判断:差异无法收敛时怎么办

退出不是放弃页面,而是停止把该 URL 当作可索引目标。适用条件包括:两个入口长期返回互相冲突的状态码,或 robots 指令与状态码组合导致既无法稳定抓取也无法稳定索引,且你无法在可接受成本内统一。此时应明确保留一个规范入口,其余入口按重定向或移除处理,并在死链接检测结果中标记为“已收敛”,避免后续复检反复报警。

需要克制的一点:抓取量下降、某次检测请求返回空结果,都不能单独证明处理正确。它们也可能是检测请求头变化、缓存命中或临时服务波动的结果。判断是否收敛,应看固定请求头下的状态码、robots 指令和最终 URL 是否稳定一致,而不是看单次统计的升降。

一个可复用的判断顺序

  1. 用同一组请求头分别请求两个入口,记录状态行、Location、X-Robots-Tag 与 Content-Type。
  2. 若状态码不同,先按可访问性处理,不要用正文一致来推翻状态码差异。
  3. 若状态码相同但 robots 指令冲突,确认哪一层生效,再决定移除、补齐还是退出索引。
  4. 若仅缓存或协商头不同,保留原状并固定基线复检,把差异记录为已知偏差。
  5. 每轮改动后复检内链、站点地图与最终 URL,确认没有制造新的断点。

假设某页面经 A、B 两个入口返回相同正文,A 为 200 且无 robots 限制,B 为 301 指向 A。按上述顺序,保留 A、把 B 视为重定向入口即可;若 B 返回 200 但带 noindex,则要先确认该指令是否有意,再决定改写还是退出。这个例子只说明比较方法,不代表任何真实站点的处理结果。

图1 图2

nginx