404 not found 的意思是服务器能收到请求,但找不到对应资源,于是返回这个状态码。放到发布流程里,它更像一次小流量灰度给出的预警:少量样本下一切正常,不代表全量之后不会出现例外。灰度阶段真正要验证的,不是“有没有 404”,而是“哪些请求路径在规模化后才会走到没有资源的终点”。
小流量灰度通常只覆盖一部分入口、一部分地区或一部分参数组合。它成立的前提是:被抽样到的请求路径,恰好都命中了已发布的资源。一旦全量放开,长尾路径、旧链接、大小写变体、带追踪参数的地址开始进入,404 才会集中出现。
所以灰度正常有两种合理解释,不能只归因于发布正确:一是样本确实覆盖了主要路径;二是样本量太小,长尾尚未被触发。区分这两者的证据不是“有没有报错”,而是灰度期间实际命中的 URL 集合,与全量后可预期的 URL 集合之间差了多少。
此时灰度可以只验证新增资源能否返回正常状态。动作是:在灰度环境里请求新增资源的代表性地址,确认返回内容而非 404。结果若正常,下一步可以把范围扩大到带参数、带尾斜杠的变体,因为这些变体最容易在全量后才被外部链接带进来。
这类变更不能靠小流量灰度下结论。旧地址在新规则下会落到没有资源的终点,灰度样本里没有旧链接,自然看不到 404。此时应改为“映射核对”而不是“抽样观察”:列出已知的旧地址集合,逐条对照新规则下的目标地址,确认每条都有落点。
选择依据很直接:如果变更改变了地址与资源的对应关系,灰度抽样就失去代表性;如果只是新增,抽样仍然可用。
假设某站点把栏目页从 /old-list/ 迁到 /new-list/,灰度只放给一小部分入口,且这些入口内部链接都已更新。灰度期间没有 404,于是判定通过。全量后,外部链接、历史收藏、旧站内引用仍指向 /old-list/,这些请求开始返回 404。
这个例子里的关键动作是:在灰度阶段额外请求一批“已知旧地址”,而不是只请求新地址。若旧地址返回 404,下一步就不是扩大灰度,而是先补上重定向映射,再考虑全量。这个判断与样本量无关,只与是否覆盖了旧地址有关。
看到 404 增多时,不要立刻把它当成索引故障。抓取层面的 404 表示请求到达但资源缺失;索引层面的表现则取决于该地址此前是否被收录、以及搜索引擎后续如何处理。两者不是同一件事。
可执行的动作是:先从访问日志里按状态码筛出 404 的 URL 列表,再按“是否曾返回 200”分组。这个分组结果决定下一步——曾返回 200 的地址优先核对映射,从未返回 200 的可以暂缓。
灰度适合验证“规则在样本内是否成立”,不适合验证“规则在全体地址上是否成立”。当变更只做增量、地址对应关系不变时,灰度结论可以外推;当变更涉及重写、迁移、删除或大小写归一化时,灰度结论只能作为参考,必须补一次全量地址映射核对。
另外,站点地图提交不保证收录,HTTPS 也不保证页面不返回 404,更不保证排名。这些手段解决的是各自层面的问题,不能替代地址映射本身的正确性。不同搜索引擎对同一状态码的处理方式需要分别核查,不能用一个平台的表现推断另一个平台。
把灰度当成一次“抽样检查”而非“全量证明”,并在变更涉及地址对应关系时补做映射核对,才能让 404 从意外变成可解释的结果。