核心结论:当死链检测结果随功能开关变化时,不要只记“这次检测到了什么”,而要同时记录开关状态、生效范围和检测时点,否则同一 URL 在不同版本下会得到互相矛盾的结论。可行做法是给每次检测绑定一个可复核的版本标识,而不是把开关状态写进备注了事。
假设一个情境:某站点用功能开关控制商品详情页是否渲染“相关推荐”模块,该模块内含指向已下线分类的链接。开关开启时,检测工具会把这条链接报为站内死链;开关关闭时,同一 URL 的检测结果完全干净。此时有两种看似合理的记录方式。
两者的取舍在于查询方向:方式一便于回答“这次检测整体是否正常”,方式二便于回答“这个 URL 从什么时候开始出问题”。如果团队已经按批次归档报告,硬改成 URL 维度会带来迁移成本;反之,只保留批次记录,在开关频繁切换时几乎无法还原某条死链的首次出现时间。
只写“开关 A 已开启”通常不够,因为同一开关在不同环境、不同用户分组下可能取值不同。一个可复核的版本标识至少应包含以下要素。
实际动作:在下一次检测前,先固定一个开关组合并记录上述四项,再执行抓取。这样做的结果是,当后续检测出现不同结论时,可以直接比对版本标识,判断差异来自开关变化还是来自页面本身的内容更新,而不必重新跑一遍全站。
当同一 URL 在两次检测中结论相反,按以下顺序排查,能较快定位原因。
需要说明的是,抓取量或报错数突然归零,并不能单独证明开关处理正确。它也可能是抓取被限制、入口失效或检测范围被缩小的结果。因此归零本身应触发一次版本标识核对,而不是直接记为“问题已解决”。
如果团队用死链工单流转修复,建议每条工单至少带一个版本字段,而不是把开关信息写在自由文本里。一个最小结构可以是这样:
url=..., switch=name:value, scope=..., detected_at=..., source=..., status=...
这样做的直接结果是,修复人员能判断该条死链是否只在特定开关下出现。如果只在开关开启时出现,修复方式可能是调整开关配置或模块内的链接生成逻辑;如果与开关无关,则按常规死链处理。两种路径的代价不同,前者需要回归验证开关关闭状态,后者只需验证单页。
上述做法适用于开关会影响页面链接输出的站点。若开关只影响样式或文案,不影响链接结构,则版本记录可以简化,只需保留检测时点。另外,若站点同时使用站点地图和 robots.txt 控制抓取范围,需注意:robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录,这两者都不能替代版本状态记录。HTTPS 同样不保证页面内容不随开关变化,因此不能作为版本一致性的依据。
最终要记住的是:版本状态记录的目标不是证明某次检测正确,而是让下一次检测的差异可以被解释。只有差异可解释,死链检测的结论才能被复用,而不是每次从零开始。