先给出结论:当功能开关让页面在“开”和“关”两种状态间切换时,不要只记一个当前URL是否404。要为每个开关状态分别记录“请求URL、响应状态、最终可见内容指纹、生效时间”,并让这四项能对应到同一个开关配置版本。否则不同角色看到的“页面正常”“页面已死”往往只是处在不同开关分支下,分歧无法收敛。
功能开关(feature flag)常见于灰度发布、A/B测试或临时降级。它可能改变页面模板、路由、接口返回,甚至让原本存在的链接在某个分支下不再输出。此时“死链”可能只在一个分支成立,在另一个分支完全正常。
把分歧转成可核对项目的第一步,是让每个角色说明自己观察时的三个前提:
new_route=on 或 new_route=off)如果三个人给出的开关取值不同,那么讨论的其实不是同一个页面,先统一取值再谈状态。
不要用“已修复”“未修复”这种无法核对的说法。建议对每个开关状态生成一条记录,字段如下:
promo_banner=on。这样做的实际动作是:先固定一个开关取值,再采集上述记录;然后切换取值,重复采集。结果会直接影响下一步——如果两个状态都返回200但内容指纹不同,问题属于内容差异而非死链;如果只有一个状态返回404或410,那么修复目标就锁定在该分支的链接输出逻辑上。
假设某活动页有一个开关 old_path=on。当它为 on 时,页面从旧路径 /old 输出;为 off 时,旧路径不再输出,只保留 /new。此时可能出现:
old_path=on 时访问 /old,得到200,认为链接正常。old_path=off 时访问 /old,得到404,认为存在死链。如果只记录“/old 是否404”,两人永远无法达成一致。正确做法是记录两条版本状态:old_path=on 时 /old 为200;old_path=off 时 /old 为404。接下来要决定的是:关闭开关后,旧路径是否应该保留跳转。这个决定会改变下一步的修复动作——保留跳转则需要在关闭分支中补一条重定向规则;不保留则需要在所有引用旧路径的页面中更新链接。
第一类是缓存。同一个开关取值下,不同角色可能命中不同缓存层,看到旧内容。记录时应注明是否绕过缓存,或至少记录响应头中的缓存相关字段,避免把缓存差异误判为开关分支差异。
第二类是抓取限制与索引状态被混为一谈。robots.txt 的抓取限制不等于可靠的索引移除;站点地图不保证收录。也就是说,即使某个开关状态下页面返回200且被写入站点地图,也不能据此断定它一定被搜索引擎收录。记录版本状态时,把“可抓取”“可索引”“已收录”分开写,不要用其中一个代替另一个。
当每个开关状态都有独立记录后,处理顺序会变得清晰:
最后,把每条记录的采集时间、开关取值和响应结果一起保存。这样下次有人提出“这个页面到底是不是死链”时,不需要重新争论,只需要核对当时对应的开关版本。记录的目的是让分歧变成可以逐条核对的项目,而不是让某一个人的观察成为唯一结论。