灰度只覆盖一部分入口时,死链查询结果看起来干净,并不代表全量发布后所有真实入口都健康。更常见的情况是:灰度命中的是主模板和主路径,而全量发布才把旧路径、边缘模板或低频入口暴露出来。要判断这是不是问题,先分清两种解释:一种是灰度样本本身不具代表性,另一种是全量发布改变了链接生成逻辑。
第一种解释是样本偏差。灰度只放出少量页面或少量入口,被抓取和点击的路径集中在首页、栏目页和热门内容。死链查询如果只围绕这些路径做,返回的 200 或 301 只能说明这批入口暂时正常,不能推出全站正常。它的典型表现是:灰度期间错误集中在少数模板,而全量后错误分散到多个模板。
第二种解释是发布动作改变了链接。全量发布可能替换了导航、分页、面包屑或静态资源引用,使原本在灰度中不存在的链接进入页面。此时死链不是“原来就坏”,而是“发布后才生成”。它的典型表现是:同一批 URL 在灰度前后状态不同,且变化时间与发布窗口接近。
这两种解释不能只靠一次扫描区分。如果只看总错误数,样本偏差和发布变更会混在一起;要分开,需要把“哪些链接被检查过”与“哪些链接在全量后才出现”分别记录。
先做最小动作:取灰度期间实际返回过正常状态的 URL 样本,在全量发布后按原样复测,并记录状态码、最终跳转地址和检查时间。这个动作的结果会直接影响下一步——如果同一批 URL 状态不变,问题更可能来自新增入口;如果同一批 URL 状态改变,问题更可能来自发布对模板或规则的改动。
再补一个动作:把全量发布后新出现的链接与灰度期间的链接做差集,只检查差集里的 URL。差集里错误集中,说明灰度没覆盖到这些入口;差集里错误很少而旧样本大量出错,说明发布改动影响了原有路径。两种结果对应不同的修复顺序,前者优先补检查范围,后者优先回看发布变更。
这里要避免一个误判:抓取量下降、日志里某类请求归零,或站点地图提交后没有立刻出现收录变化,都不能单独证明死链处理正确。抓取限制、站点地图和索引结果各自有不同机制,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。把这些现象当成死链已解决的证据,会把“没被抓”误当成“没有坏链”。
没有全量日志或后台权限时,仍可执行的最小动作是:选一组灰度期间确认正常的 URL,在全量发布后复测,并保存状态码与最终地址;同时从页面 HTML 里抽取新增链接,与灰度样本做差集。这个动作不能推出全站死链比例,也不能推出搜索引擎会如何处理这些链接,但能区分“旧链接变坏”和“新链接才坏”这两个方向。
如果需要更接近真实入口,可把检查范围限制在导航、分页和内容正文中的链接,而不是只查站点地图。站点地图反映的是提交意图,不等于用户和抓取实际会走的路径。这个取舍的代价是覆盖不全,收益是能更快定位发布引入的例外。
假设某站灰度只放出 20 个内容页,死链查询显示这 20 页的正文链接全部返回 200。全量发布后,新增了旧版分页入口和一组标签页。此时复测原 20 页仍为 200,但标签页里出现 404。这个结果支持“灰度样本没覆盖标签模板”,而不是“全量发布把原链接改坏”。下一步应把标签模板加入检查范围,而不是回滚全部发布。
反过来,如果原 20 页中有 5 页在发布后从 200 变成 404,且这些页共用同一导航模板,那么更值得先核对导航模板的发布差异。这个例子只用于说明比较方法,不代表任何真实站点结果。
一次小流量灰度能回答的是“被检查过的那批入口是否正常”,不能回答“全量入口是否正常”。全量发布后,如果死链查询结果变差,先确认检查集合是否扩大,再确认链接生成逻辑是否改变。只有把这两件事分开,才能决定是补样本、改模板,还是回退发布。缺少完整数据时,最小可执行动作仍然是复测灰度样本并抽取新增链接差集;它不承诺收录、排名或收益,也不替代对具体搜索引擎支持情况的分别核查。