结论是:只要功能开关会改变页面上链接的可见性或跳转行为,死链查询就必须把“开关状态”当成版本的一部分来记录,否则不同角色会拿着同一份清单得出互相矛盾的结论。具体做法是先固定一个可复核的状态标识,再让查询结果与这个标识绑定。但这条结论有一个反例:如果开关只影响页面样式、不影响链接的渲染与可访问性,那么为它记录版本状态就是多余的,反而增加维护成本。
功能开关的常见形态是:同一套模板,在开关打开时渲染一组入口链接,关闭时渲染另一组。运营看到的页面是开关打开后的版本,开发本地跑的是默认关闭版本,两者对同一批链接是否存在的判断自然不同。问题不在于谁看错了,而在于双方没有把“当时开关处于什么状态”写进同一份记录。
可以区分两类原因。第一类是开关本身改变了链接集合,属于真实差异;第二类是开关未生效、缓存未刷新或环境配置不同,属于观测差异。前者需要记录版本,后者需要先排除环境因素再讨论。把两类混在一起,就会把环境问题误判成链接问题。
不需要记录所有构建信息,但下面几项缺一不可,且要能被人独立核对:
把这些字段放进同一条记录后,任何角色都能复现当时的观测条件,分歧就从“谁说得对”转成“哪条记录对不上”。
假设某页面在开关 A 打开时输出指向 /old-path 的链接,关闭时输出指向 /new-path 的链接。甲在开关打开时导出清单,判定 /old-path 为死链;乙在开关关闭时导出清单,认为该链接根本不存在,因此判定甲的报告无效。
两人都没有错,错在清单没有绑定开关取值。若甲在记录中写明“开关 A = 打开,抓取时间 T,清单来自渲染后页面”,乙的核对就会变成“在开关 A 打开的条件下复核”,而不是直接否定。此时下一步动作也很明确:先确认 /old-path 在开关打开期间是否真实返回错误,再决定是修复目标地址还是调整开关默认值。
反例是开关与链接无关的场景。如果开关只控制颜色、间距或文案,不改变任何链接的渲染、跳转或可访问性,那么把开关状态写进死链记录只会稀释真正有用的信息,让读者误以为开关与链接问题相关。判断标准很简单:问一句“开关切换后,页面上可点击的地址集合是否发生变化”。答案是否,就不必记录;答案是是,或暂时无法确定,就按上面的字段记录。
另一个容易失效的点是把抓取限制当成移除手段。用 robots.txt 屏蔽某路径,只能影响抓取行为,不等于该地址会从索引中消失,也不能替代对死链本身的处理。同理,站点地图里列出了某地址,不代表它一定被收录。这些现象只能作为线索,不能单独用来证明链接状态已经处理正确。
先冻结一份带开关取值的链接清单,再对清单中每个地址记录实际响应。若同一地址在开关打开与关闭两种状态下响应不同,说明它属于条件性死链,处理时应同时说明条件,而不是简单标记为“已修复”。若两种状态下响应一致,则开关不是变量,可以回到常规的死链处理流程。
完成这一步后,团队得到的不是一份结论,而是一份可复查的对照表。后续无论是修复、回退还是维持现状,都能基于同一组条件讨论,而不是各自引用不同时间、不同开关状态下的观测结果。