把灰度当成一次小规模的全量发布,而不是一次抽样检测——这是判断例外是否成立的前提。具体做法是:选取一个可独立回滚的页面子集,用与全量相同的发布路径推送,观察该子集的抓取与收录状态是否与全量预期一致。若子集出现与预期不符的例外,先确认它是否由发布动作本身引起,再决定全量是否推迟。下面以你手中一份待发布的页面清单为对象,逐步展开。
灰度要暴露例外,前提是子集与全量共享同一套发布逻辑。如果你只挑选了结构最简单、内链最丰富的几个页面,它们大概率不会触发例外,灰度也就失去了预警价值。
更稳妥的选法是按页面类型分层:从每个主要模板中各取一到两个 URL,覆盖不同的目录深度、不同的内链层级、是否在站点地图中、是否曾被抓取过。这样做的代价是子集规模变大,回滚时需要处理的 URL 更多;收益是例外更容易在灰度阶段显形,而不是等全量上线后才被发现。
一个可操作的判断标准是:如果灰度子集里没有任何一个页面与全量页面在模板、内链或历史抓取记录上存在差异,这次灰度的结论就不能直接外推到全量。
手工在后台改几个页面,和走完整的发布流程,暴露的问题完全不同。前者绕过了构建、模板渲染、站点地图生成、缓存刷新等环节,恰好是例外最容易出现的地方。
因此灰度应当复用全量的发布通道,只把目标 URL 范围缩小。假设一次发布涉及模板改动和站点地图重新生成,灰度阶段就应让这两步都真实执行,只是输出范围限制在子集内。动作的结果会直接影响下一步:如果灰度中站点地图正常更新但子集页面未被抓取,说明问题可能出在抓取限制或页面本身,而不是发布通道;如果站点地图没有更新,那全量发布同样会带着这个缺陷上线。
需要提醒的是,站点地图更新只表示你提交了这些 URL,并不保证它们被收录。灰度中看到站点地图包含子集页面,不能当作收录成功的证据。
灰度阶段最容易混淆的是:页面没被抓取,和页面被抓取但没进索引,是两类不同的问题,处理方式也不同。可以从以下证据入手区分。
这里有一个容易踩的坑:robots.txt 的抓取限制不等于可靠的索引移除。用 robots.txt 屏蔽灰度子集,只能阻止抓取,已经进入索引的 URL 仍可能留在索引里。如果你的目的是让灰度页面不被索引,需要的是页面级的移除手段,而不是抓取限制。
灰度跑完后,你手里会得到一份子集页面的状态清单。把它转成决策,关键是区分「例外是否由本次发布引起」。
假设你发现灰度子集中有一个页面在发布后返回了非预期状态码,而发布前正常。这个例外与模板渲染相关,那么全量发布时同模板下的其他页面大概率也会出现同样问题。此时正确的下一步不是继续扩大灰度,而是先修复模板再重新跑一次灰度。
灰度通过不等于全量一定顺利。子集规模小,可能恰好避开了某些边界情况,比如分页序列的最后一页、带参数的 URL、或历史上被抓取频率极低的深层页面。
因此全量发布后,应针对这些边界类型单独抽查,而不是只看整体抓取量是否上升。抓取量上升可能来自原有页面的正常波动,与本次发布无关;把它当作发布成功的证据,容易掩盖真正的例外。
另外,HTTPS 只保证传输层加密,不保证页面安全无漏洞,也不保证排名。灰度中如果为了排查问题临时调整了协议或证书配置,需要确认这些调整不会带入全量发布,否则会把一个与索引无关的变量混进判断里。
最终,是否全量发布取决于例外是否可解释、是否可控。若例外无法归因,推迟全量并重新设计灰度子集,比带着未知风险上线更划算。