结论先说:功能开关切换后,不要只记录“页面当前返回什么”,而要把开关名、开关状态、生效时间、请求标识和响应摘要放进同一条记录,否则死链检查结果无法回放到具体版本。这个做法只在你能控制或至少能观察到开关状态时成立;如果开关由第三方灰度平台按用户分群随机下发,同一 URL 对不同访客可能返回不同结果,单条记录就不足以代表页面版本。
功能开关改变的是同一路径下的渲染分支或跳转目标,不是换了一个网址。死链检查工具通常按 URL 去重,先抓到的结果会被当成该地址的稳定状态。开关切换后重跑,得到相反结论,很容易被误判为“检查工具不稳定”或“链接时好时坏”。
更合理的解释至少有三种:开关状态在两次检查之间变了;两次请求命中了不同分群;页面内部依赖的接口在开关打开后返回了不同的链接集合。要区分它们,必须让记录里带上能区分原因的证据,而不是只留一个状态码。
假设你正在排查一个由开关控制导航区链接的页面,记录至少应覆盖以下内容:
把这几项写进同一行记录,后续对比时才能回答“是开关变了,还是分群变了,还是页面本身变了”。
当开关的判定逻辑依赖实时风控、地理位置或随机百分比,且你无法固定分群时,上述记录只能证明“这次请求看到了什么”,不能证明“这个 URL 的版本是什么”。此时把单次结果写进死链清单并标记为确定结论,会制造假阳性。
另一个失效条件是开关只影响前端渲染、不影响服务端返回的 HTML。如果死链检查只解析初始响应体,开关切换后页面在浏览器里变化,但检查结果不变。这不能证明开关没生效,只能说明检查没有覆盖到渲染后的链接。
假设某页面在开关 A 关闭时,导航链接指向 /old-path;开关 A 打开后改为 /new-path。第一次检查记录为:开关 A=off,请求时间 10:00,状态码 200,链接集合哈希 h1。第二次检查记录为:开关 A=on,请求时间 10:30,状态码 200,链接集合哈希 h2。
如果 /old-path 返回 404 而 /new-path 返回 200,你可以判断死链只存在于关闭分支,下一步应确认关闭分支是否仍在被真实用户命中,而不是直接删除 /old-path。如果两条记录里开关状态相同但链接集合哈希不同,则问题更可能来自接口数据或缓存,而不是开关本身。
先固定一个开关状态,连续抓取同一 URL 三次,记录每次的链接集合哈希。若三次一致,说明该状态下页面版本稳定,可以把该状态作为基线,再切换开关重复同样动作。若三次不一致,先排查缓存和分群,不要继续扩大死链清单。
完成基线记录后,再对比开关切换前后的链接集合差异。差异中新增的 404 才是与开关直接相关的候选死链;差异中消失的链接只能说明当前分支不再引用它,不能据此判断它已失效。这个区分会直接决定你是回滚开关、修正目标地址,还是只更新检查脚本的解析范围。