灰度发布只验证了部分页面和部分路径,全量上线后出现例外,通常不是灰度本身失效,而是灰度样本没有覆盖全量发布才会触发的条件。要把这件事变成可执行的判断,先别急着回滚,而是把例外归因到三类变量:链接是否真的进入可抓取HTML、目标页是否允许被索引、以及链接在规模化后是否被模板或分页逻辑改写。下面以一个假设的电商分类页改版为例,说明如何从一次灰度结果推导出全量发布前必须补齐的边界。
灰度阶段通常只挑少量分类页,手动加了指向核心商品页的内链。此时链接出现在HTML里,爬虫能顺着走,看起来一切正常。全量发布后,内链由模板批量生成,问题往往出在模板条件判断上:比如只有库存大于零的商品才输出链接,或者只有某个楼层配置了推荐位才渲染锚文本。灰度样本恰好都满足条件,全量页面里大量不满足,链接直接不输出。
判断方法很直接:从全量页面里随机抽三类样本——灰度覆盖过的、灰度没覆盖但结构相同的、灰度没覆盖且结构不同的。对每一类,查看渲染后的HTML源码里目标链接是否存在,而不是只看浏览器里能不能点击。如果只有第三类缺失,说明例外来自结构差异;如果第二类也缺失,说明模板条件比灰度时更严格。
内链优化在全量发布后失效,常见原因是把“页面能打开”误当成“链接可被抓取”。要区分三件事,并分别记录结果:
<a href="...">是否服务端输出。若靠JavaScript后置插入,不同抓取能力的访问者看到的结果不一致,灰度时手动测试容易漏掉。完成这三步后,你会得到一个明确的分叉:如果链接在HTML里、目标页可索引、URL未被改写,那么例外不在内链本身,应转向内容质量或站点整体抓取预算;如果任一项不成立,先修对应环节,再谈内链布局。
灰度样本天然偏向“正常路径”,而全量发布才会遇到边界页面。以下三类边界必须在全量前单独抽样,不能靠灰度结果推断:
针对这三类边界,动作是:在全量发布前,从每类边界各抽至少一个URL,用与灰度相同的检查方法过一遍。只要有一类不通过,就说明全量发布存在例外,应把该类页面排除在批量内链规则之外,或先修正模板条件再发布。
假设某站点灰度时在3个分类页各加了10条内链,抓取日志显示这些链接被访问。全量发布后,站点发现新商品页的抓取量没有同步上升。此时不要直接判定“内链无效”,可以按以下顺序做一次最小改动验证:
这个例子的数字仅用于说明比较方法,不代表真实项目结果。它的价值在于把“全量后例外”拆成一个可单独验证的变量,避免一次性改动太多导致无法归因。
要让下一次全量发布不再被同类例外打乱,灰度阶段就应记录三类依据:样本页面的结构特征、链接输出所依赖的模板条件、以及目标页的索引状态。全量发布后,用同样的字段抽查边界页面,对比差异。如果差异只出现在模板条件上,修模板;如果差异出现在目标页索引状态上,先解决索引策略;如果差异出现在URL规则上,先统一链接生成逻辑。站点地图不保证收录,HTTPS也不保证安全无漏洞或排名,这些都不能替代上述逐项核查。把灰度结论当作“部分样本成立”的证据,而不是全量安全的证明,才能在下一次发布时提前划出不能直接照搬的边界。