先给有条件的结论:只有当每个网址规则都能追溯到唯一一个“规则所有者”时,死链测试工具报出的异常才可能被稳定归因;如果同一个URL前缀由两套系统各自生成,那么工具报告只能说明哪里出错,不能说明该由谁改。让结论成立的关键动作,是把“谁生成、谁发布、谁验证”写进同一份规则台账,并规定每条规则只能有一个所有者;一旦出现两个所有者,归因就会失效,需要先合并职责再谈修复。
死链测试工具通常按链接、状态码和跳转链判断可达性,它看到的是结果,不是生成过程。当CMS、路由中间件、商品或内容接口、CDN重写规则同时参与拼装网址时,同一条失效链接可能由多层规则叠加造成。工具会把它归入某个目录或模板,但不会知道这个目录名是模板写死的,还是接口返回的,还是边缘重写临时改的。于是团队容易把问题转给“最熟悉这块的人”,而不是真正的规则所有者。
要判断归因是否可靠,可以看一个证据:把失效URL与生成它的规则做一对一映射。如果一条URL能对应到唯一规则ID、唯一所有者和唯一发布批次,归因成立;如果一条URL对应两条以上规则,说明责任方尚未定义。
不要停留在“谁负责这块业务”的口头约定,而是让每条网址规则带可核对的身份信息。台账至少应包含:规则ID、匹配的URL前缀或模式、生成系统、所有者角色、发布方式、最近变更批次、验证方式。关键约束是:同一URL前缀只能存在一条“生成规则”,其他系统若要改写,只能登记为“修饰规则”,并且必须声明它依赖哪条生成规则。
这样做的直接结果是:工具报出异常时,可以按URL前缀反查生成规则所有者,而不是按系统名称猜测。下一步动作也随之明确——先确认异常落在生成规则还是修饰规则,再决定是改路径结构还是改重写条件。
假设两个系统都生成 /promo/ 开头的网址:活动系统生成 /promo/spring/,商品系统生成 /promo/item/。如果台账只登记了“/promo/ 由活动系统负责”,那么商品系统产生的死链会被错误归给活动系统。反过来,如果两个系统都声称拥有 /promo/,死链测试工具报出的每个异常都会陷入争论。
这个反例说明:唯一责任方不是按系统划分,而是按URL前缀的生成权划分。当前缀被共享时,必须拆分为更细的前缀,例如 /promo/spring/ 归活动系统,/promo/item/ 归商品系统,并禁止任一系统生成对方前缀下的路径。若无法拆分,就需要指定一个系统作为前缀所有者,另一个系统只能通过它提供的接口申请路径,不能再自行拼装。
拿到死链测试工具的报告后,按以下顺序处理,可以让归因结果直接影响下一步:
这个顺序的作用是:避免把“工具报错”直接等同于“生成系统有bug”。如果某组前缀长期没有生成规则变更,却持续出现死链,更合理的解释可能是外部链接指向了已废弃路径、修饰规则误删了路径段,或者内容里手写了不存在的网址。此时下一步应是检查修饰规则和内容来源,而不是继续修改生成逻辑。
唯一责任方确定后,死链测试工具的用法会发生变化:不再全站一把跑完就分派,而是按前缀所有者分别出报告。每个所有者只接收自己生成规则覆盖范围内的异常,修饰规则造成的异常则退回到修饰规则所有者。验证时要注意,robots.txt 的抓取限制不等于可靠的索引移除,站点地图不保证收录,工具报告里的“可访问”也不等于该网址应该存在。责任方要判断的是规则意图,而不是单次状态码。
如果团队暂时无法维护完整台账,最低限度也要做到:每条URL前缀有人认领,认领人有权修改生成逻辑,并且死链报告按前缀而不是按页面模板分派。做不到这一点时,先不要扩大死链测试工具的扫描范围,因为报告越全,责任越难落地。