如果两个地址返回的正文完全一样,但响应头不同,死链检测工具通常会把它们当作不同状态处理。真正需要先判断的不是“内容是否重复”,而是响应头里的状态码、Content-Type、Content-Length、Location、X-Robots-Tag和缓存指令是否指向同一份可索引资源。若状态码不同,工具会把其中一个记为失效、另一个记为正常;若状态码相同但内容类型或长度不同,工具可能误判为截断、软404或代理返回。此时应先保留响应头差异作为线索,再决定是修复、替换还是让旧地址退出。
假设旧系统返回200和text/html,新入口也返回200,但Content-Length相差较大,且正文肉眼看起来一致。死链检测工具可能因为读取到不同字节数而标记为“内容不完整”。这种差异常见于旧系统压缩输出、代理层追加脚本或模板尾部注入。判断依据不是长度本身,而是同一路径在多次请求中是否稳定出现同一差异。若稳定,下一步应抓取完整响应头并对比Content-Encoding、Transfer-Encoding和缓存头,确认差异发生在源站还是中间层。
动作上,可以先用curl -I或工具自带的响应头视图分别请求两个地址,记录状态码、内容类型、长度和缓存指令。如果确认差异来自中间层且正文主体一致,可把旧地址保留为跳转或规范化目标,而不是直接删除。若差异来自源站模板,则修复模板后重新检测;修复结果会影响下一步:若修复后两个地址的响应头趋于一致,工具不再报异常,就可以把旧地址列入观察清单;若仍不一致,则要按不同资源处理,不能只凭正文相同就合并判断。
一种情况是旧地址返回404或410,新地址返回200,正文相同。此时死链检测工具会把旧地址记为死链,这是符合预期的。选择取决于旧地址是否仍有外部链接或用户书签。如果仍有价值,应把旧地址改为301指向新地址,并保留一段时间;如果没有保留价值,可让旧地址继续返回410,同时从站点地图和内部链接中移除。这里的关键是410比404更明确地表达“已删除”,但不同搜索引擎对两者的处理节奏可能不同,须分别核查。
另一种情况是旧地址返回302或307,新地址返回200,正文相同。临时跳转不会传递稳定的规范化信号,死链检测工具可能把它记为“可访问但非最终地址”。如果旧系统只是过渡期入口,应尽快改为301;如果只是短期维护,保留302并设置合理的缓存头。动作上,先确认跳转链是否只有一跳,再用工具复测最终地址的状态码。若最终地址返回200且响应头中的X-Robots-Tag未禁止索引,才可把该地址视为可保留目标;否则即使正文相同,也不应作为替代入口。
两个地址正文相同,但一个带有X-Robots-Tag: noindex,另一个没有。死链检测工具通常只报告状态码和内容摘要,不会替你做索引决策。此时应把带noindex的地址视为“可访问但不应作为搜索结果入口”。如果旧地址需要退出,可以在响应头中保留noindex,同时用301把用户和爬虫导向新地址;如果旧地址需要保留,则要移除noindex并确认没有其他冲突指令。robots.txt的抓取限制不等于可靠的索引移除,站点地图也不保证收录,因此不能只靠这些手段替代响应头判断。
实际动作是:先列出所有正文相同的地址,再按响应头分成“可索引”“不可索引”“跳转中”“已失效”四组。对“不可索引但可访问”的组,决定是保留为备用入口还是让它退出;对“跳转中”的组,检查Location是否指向最终可索引地址。这个分组结果会影响下一步的检测频率:可索引组只需常规复查,跳转中组需要缩短复查间隔,已失效组则不再作为修复对象。
如果响应头中的Vary、Cache-Control或ETag不同,同一地址可能在不同请求中返回不同内容或不同状态。死链检测工具若未携带相同请求头,可能把正常页面记为异常,也可能把异常页面记为正常。判断依据是:用相同请求头重复请求,观察状态码和正文是否稳定。若不稳定,先排除内容协商和缓存层问题,再判断是否真的是死链。
动作上,可以固定User-Agent、Accept和Accept-Language后连续请求同一地址,记录每次的状态码、内容长度和ETag。如果差异消失,说明之前的异常来自请求头或缓存,不应直接修改页面;如果差异仍在,才进入修复或退出流程。例外是:当旧系统已经无法调整响应头时,可以保留一个静态跳转页作为过渡,但要明确它只是临时措施,不能替代对最终地址的检测。
Content-Type、Content-Length、Location、X-Robots-Tag和缓存头,不要只看正文。301还是410;不要因为内容相同就默认两个地址等价。最终判断标准是:同一份内容对应的每个地址,其响应头是否明确表达了“保留、跳转或退出”。如果响应头互相矛盾,死链检测工具给出的结论只能作为线索,不能直接当作处理依据。