结论先说:内容相同不代表处理相同。响应头里的状态码、缓存指令和重定向信息,决定的是“这个地址是否还应该被当作有效入口”,而不是“用户看到的东西有没有变”。当同一个页面通过两个地址返回完全一样的正文,但一个返回 200、另一个返回 404 或 301 时,死链检查的结论会分叉。你需要先判断这是配置冗余还是真实失效,再决定修链接还是改服务器规则。
实际业务中常见这样一组对照:/old-path 返回 404,但响应体里仍然是完整的商品介绍;/new-path 返回 200,正文与之逐字相同。人眼看起来“页面还在”,死链检查工具却把前者标记为死链。反过来也有:两个地址都返回 200,正文相同,但其中一个带 Cache-Control: noindex 或指向另一地址的 Location 头。
这时不能只看正文是否相同。正文是渲染结果,响应头是协议层声明。死链检查要回答的是“这个 URL 还能不能被继续当作有效地址使用”,判断依据必须落在响应头,而不是页面像素。
解释一:真实失效,正文只是残留。如果 404 地址是被下线、被替换的旧入口,服务器仍返回旧模板内容,说明应用层没有清理兜底页面。此时正文相同是巧合或缓存残留,状态码才是事实。判断动作:用命令行请求该地址,确认状态码稳定复现,而不是偶发。
解释二:配置冗余,状态码写错了。如果两个地址指向同一份内容,其中一个本应返回 200 或 301,却因为反向代理、路由优先级或默认规则返回了 404,那么问题不在内容,而在配置。此时正文相同是正常现象,错误在响应头。
两种解释对应完全不同的下一步:前者要清理入口、更新内链、决定是否做 301;后者要改服务器或路由规则,把状态码纠正回来。如果混为一谈,就会把“配置错误”当成“页面已删除”去删链接,或者把“真实失效”当成“配置问题”一直等它自己恢复。
能帮你下判断的,是以下几类可复现的观察,而不是单次工具截图:
Location 头却仍返回 404,说明重定向规则与状态码冲突,属于配置问题。no-store,说明两个地址走的是不同处理链路,状态码差异可能来自链路而非内容本身。需要提醒的是:抓取量或请求量归零,不能单独证明某个地址已被正确处理。它也可能是流量自然下降、入口被移除或统计口径变化。把“没人访问”当成“已经修好”,容易掩盖仍然存在的 404。
假设某业务把商品详情从 /p/123 迁到 /product/123。检查发现旧地址返回 404,但正文与新地址一致;新地址返回 200。此时若旧地址仍被外部链接和站内导航引用,正确动作是给旧地址加 301 指向新地址,而不是删除旧地址的模板内容。执行后重新请求,确认返回 301 且 Location 指向新地址,下一步才去更新内链、把旧地址从站点地图中移除。
反过来,如果旧地址没有任何引用、也不该再被访问,那么保留一份相同正文只会让死链检查持续误报。此时应让 404 页面返回简洁的失效提示,而不是完整商品内容,避免把“已下线”伪装成“仍可用”。
面对“内容同、响应头不同”,先问一个问题:这个地址还应不应该作为入口存在。应该存在,就修响应头,让它返回 200 或 301;不应该存在,就修正文,让 404 不再携带完整内容,并同步清理引用。两个方向的动作和验证方式不同,先定方向再动手,比反复重跑死链检查更省事。robots.txt 的抓取限制不等于索引移除,站点地图也不保证收录,所以这些手段都不能替代对响应头本身的确认。