因为灰度只覆盖了主站路由,而全量发布还会把旧域名、带参数的营销页和第三方回传路径一起放出去,死链修复工具在灰度里显示正常,并不等于全量后没有新的404。要区分是工具漏报还是发布范围变化,先看灰度样本和全量样本的URL集合是否一致,再看修复规则是否只作用于被抽中的那部分路径。
假设一次发布把文章页从旧路径迁移到新路径,灰度只抽了20条主站文章链接。死链修复工具扫描后报告重定向正常,团队据此认为可以全量。全量上线后,监控里却出现一批404,集中在带?utm_source=参数的旧链接、旧域名的短链和站外回传地址上。这不是工具坏了,而是灰度样本没有包含这些入口。
这类矛盾通常指向一个被忽略的条件:灰度验证的是“发布动作”,全量验证的是“发布动作加所有对外暴露的URL集合”。死链修复工具只能对输入列表负责,输入列表不完整,输出就会给出过于乐观的结论。
第一种解释是工具漏报。也就是工具本身没有抓到旧域名或带参数链接,或者规则只匹配了规范URL,导致同一内容的变体没有被检查。第二种解释是发布范围变了。灰度只覆盖主站路由,全量时旧域名、营销落地页、站外回传路径同时切换,新增了灰度阶段不存在的跳转链路。
两者的处理方式完全不同:如果是工具漏报,需要补充URL来源和匹配规则;如果是发布范围变了,需要把灰度样本扩大到全量入口,或者在全量前单独验证新增入口。
最直接的证据是比较两次扫描的输入清单。把灰度阶段的扫描URL列表和全量前的候选URL列表并排看,如果全量列表里有一批URL从未出现在灰度清单中,就支持“发布范围变了”。如果同一批URL在灰度清单里,但工具没有报告异常,而人工请求却返回404,就支持“工具漏报”。
还可以看修复规则的作用范围。假设死链修复工具配置了把/old/a重定向到/new/a,规则只匹配路径,不匹配查询字符串。带参数的旧链接/old/a?utm_source=x可能被规则忽略,或者被重定向到新路径后参数丢失,最终落到404。这个证据指向规则覆盖不足,而不是发布范围扩大。
另一个可区分点是时间顺序。全量发布后立即出现的404,如果集中在旧域名和带参数链接上,通常和入口范围有关;如果出现在灰度已经验证过的主站路径上,则更可能是工具扫描时使用了缓存结果,或者发布过程中规则没有真正生效。
在全量发布前,从死链修复工具的扫描清单里单独抽出一组“灰度未覆盖入口”,包括旧域名、带参数链接、站外回传路径和短链。对这组入口做一次独立请求,记录状态码和最终落地URL。如果这组入口出现404或跳转到错误页面,就把它们加入修复规则,再重新扫描一次。
这个动作的结果会直接影响下一步:如果新增入口全部正常,说明灰度样本需要扩大,而不是工具本身有问题;如果新增入口里有一部分在工具里显示正常、实际请求却失败,说明工具的报告口径和实际请求口径不一致,需要先统一检查方式,再谈修复。
死链修复工具的扫描结果只能代表它输入的那批URL。对已有经验的团队来说,更稳妥的做法是在发布检查里加一条:全量前确认灰度样本是否覆盖了所有对外入口,尤其是旧域名、带参数链接和第三方回传路径。如果这些入口不在灰度范围内,就不要用灰度通过来推断全量安全。
同时,不要把站点地图或robots.txt当作全量入口清单。站点地图不保证收录,robots.txt的抓取限制也不等于可靠的索引移除。它们可以作为URL来源之一,但不能替代对实际外链和回传路径的检查。把这些入口单独列出来,再用死链修复工具扫描,才能让灰度结论和全量发布之间的差距变得可解释。