灰度只验证了“正常路径”,全量才会撞上“例外路径”。假设一个情境:你准备把一批新页面通过站点地图与内链入口发布,先拿 5% 的页面做灰度,观察抓取与收录表现。灰度期间一切正常,于是全量放开,结果大量页面停留在“已发现未抓取”,甚至部分页面被 robots.txt 挡住。问题不在灰度本身,而在于灰度样本没有覆盖全量时才会出现的例外。
灰度通常按目录、模板或时间批次抽样。如果新页面都来自同一个模板,灰度抽到的往往是最“干净”的那批:URL 规范、参数少、内链充足。全量发布时,例外才浮现出来:带跟踪参数的变体、被分页组件批量生成的列表页、从旧站迁移过来但没做 301 的历史地址。这些页面在灰度里根本没被选中,所以灰度给出的“正常”结论对它们不成立。
更隐蔽的是抓取预算。灰度只放出 5% 的入口,搜索引擎的抓取压力小,每个 URL 都能被及时处理。全量放开后,发现量骤增,抓取队列被拉长,原本在灰度里当天就被抓的页面,全量后可能几天都排不上。这时候看到“抓取量没涨甚至下降”,不能直接判定入口配置出错——它也可能是队列拥堵、站点响应变慢,或者入口本身把大量低价值 URL 一起放了进去。
面对“灰度正常、全量出例外”,常见有两种做法,选择取决于例外的性质。
判断依据不是“哪种更稳”,而是例外能否在放开前被识别。如果例外只能通过全量后的抓取数据反推,那么分批放开的价值就更大;如果例外在灰度阶段就能通过模板审查提前列出,直接全量放开再回修反而更快。
假设你要发布 2000 个商品详情页,灰度选了 100 个。灰度期间抓取正常。全量前,先做一步动作:用同一套入口规则生成完整 URL 列表,按模板和参数分组,统计每组数量和占比。结果发现其中约 300 个 URL 带筛选参数,且这些参数在灰度样本里没有出现。
此时动作是:对这 300 个 URL 先不加站点地图入口,只保留站内链接,并确认它们是否应该被索引。如果确认不该索引,就加 canonical 或 robots 限制;如果确认该索引,再单独作为一批放开。这个动作的结果直接决定下一步:如果这 300 个 URL 被证明是重复内容,那么全量放开时就不该把它们算作“新入口”;如果它们是独立有效页面,则需要为它们单独安排抓取预算,而不是混在 2000 个 URL 里一起提交。
全量后如果看到“已发现未抓取”大量增加,至少有三种合理解释:入口放量超过抓取能力、站点响应变慢导致抓取中断、或者入口里混入了大量低优先级 URL。单看抓取量归零或下降,不能证明是入口配置错了,也不能证明是搜索引擎放弃了这些页面。要区分它们,需要分别检查:站点地图里的 URL 总数与历史抓取节奏的对比、服务器日志里抓取请求的响应码分布、以及这些未抓取 URL 是否集中在某个模板或参数下。
另一个常见误判是把 robots.txt 当作索引移除工具。robots.txt 只限制抓取,不保证已索引的 URL 被移除;如果页面已经被索引,仅靠 robots.txt 挡住抓取,搜索结果里仍可能保留旧摘要。站点地图同样不保证收录,它只是提交发现入口,是否抓取、是否索引由搜索引擎自行决定。HTTPS 也不保证页面安全无漏洞或排名更好,它只是传输层的一个条件。
灰度本身不是错,错在把“灰度正常”当成“全量也会正常”。更稳妥的做法是:灰度结束后,不直接问“能不能全量”,而是问“灰度没有覆盖哪些例外,这些例外在全量放开后会不会被同时释放”。把每个例外写成一条放行条件——例如“带筛选参数的 URL 必须先确认索引策略”“旧站迁移地址必须先完成 301 映射”“分页列表必须先确认是否进入站点地图”。只有这些条件逐条满足,全量放开才是可解释的。
如果条件无法在发布前全部确认,就保留分批放开的节奏,并明确每一批要观察的指标和回退触发点。这样即使全量后出现例外,也能定位到是哪一批、哪一类 URL 引入的,而不是把整个入口配置推倒重来。