先别急着改链接或提交死链。测试工具返回 200 只说明它当时从自己的网络位置拿到了成功响应,不说明真实用户也能拿到。要复现失败,核心是让测试条件尽量贴近失败用户的路径:同一地区、同一网络类型、同一 URL 变体、同一跳转链,以及同一时间窗口。先确认差异来自哪一层,再决定是修服务端、修跳转还是只更新站内链接。
第一种解释是测试工具与真实用户请求的根本不是同一个对象。工具可能命中 CDN 边缘缓存、跟随了 301 到新地址、忽略了大小写或末尾斜杠差异,或者只请求了 HTML 而没请求页面内的资源。真实用户则可能拿到缓存过期后的回源结果,或停在跳转链中间某一跳。第二种解释是请求本身相同,但响应条件不同:用户所在网络到源站的线路、DNS 解析结果、IPv4 与 IPv6 的差异、请求头里的语言与 UA,都会让同一 URL 产生不同结果。旧内容退出阶段尤其容易出现这种分裂,因为旧地址可能只对部分线路保留了解析或回源规则。
要区分是“工具走了捷径”还是“用户路径不同”,可以按下面顺序取证。每一步的结果都会决定下一步该查什么。
Cache-Control、Age、Via、X-Cache 一类字段。若 Age 很大,说明工具读的是缓存副本;用户失败可能发生在缓存过期回源时。下一步应改用带随机查询串的 URL 绕过缓存,或在低峰时段观察回源结果。假设一个旧栏目要退出,但其中少数文章仍有价值,已迁移到新路径,旧路径只保留跳转。此时测试工具访问旧路径返回 200,是因为它跟随跳转到了新文章;而部分用户失败,可能是跳转目标只对部分线路生效,或旧路径下的子资源仍指向已下线的旧系统。复现时不要只测首页,要测三类 URL:旧栏目入口、被保留文章的旧地址、以及旧页面内引用的资源地址。如果只有资源地址失败,说明退出动作不完整,应先把资源迁到新路径或改为内联,再撤旧系统;如果跳转目标本身在多网络下不一致,应先统一跳转规则,再处理站内链接。这个顺序能避免你在链接层面反复修改,却始终碰不到真正的失败层。
找到差异层之后,把复现条件写成可重复的检查项:网络类型、解析结果、完整跳转链、响应头中的缓存状态、请求的资源清单。每次修改后按同一组条件重测,而不是换一个工具看到 200 就认为已修复。对于确认下线的旧地址,返回 410 或 404 是明确信号,但要注意 robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录;如果旧地址仍需被搜索引擎逐步清理,应结合跳转与状态码策略,而不是只靠屏蔽抓取。最后,只有当失败条件在目标用户的主要网络与设备上不再复现,才把该旧地址从待处理清单中移除,并继续观察是否出现新的失败路径。