404 not found 是服务器对“请求的资源在目标位置找不到”的响应状态,它描述的是这一次请求的结果,而不是对整站健康度的判决。把它放进灰度发布场景看:灰度只覆盖一部分流量,能暴露的例外往往只是全量发布后例外集合的一小部分。因此,灰度通过不等于全量安全,灰度失败也不等于全量必然失败。下面用一个假设情境把决策过程拆开。
假设某站点把商品详情页从旧路径迁移到新路径,先只对 5% 的访问者切换,其余仍走旧路径。灰度期间,监控显示新路径的 404 数量很低,团队准备全量切换。这个结论成立的前提是:灰度样本在入口来源、登录状态、地区、设备类型和缓存状态上,与全量流量足够接近。若不接近,低 404 只能说明“这 5% 里没撞上例外”,不能说明例外不存在。
关键动作是:在灰度阶段记录 404 的请求路径、来源页面、请求方法和响应头,而不只是计数。因为计数下降有多种解释——可能是流量本身变小、可能是缓存命中、也可能是错误被重定向掩盖。只看数字归零,无法区分这些原因。做完这一步,才能判断下一步该扩大流量还是先修例外。
小流量灰度天然偏向高频、常规路径,以下例外容易被漏掉:
/Product/A 与 /product/a、带与不带结尾斜杠,在不同服务器配置下可能一个 200 一个 404。这些例外的共同点是:它们在流量分布中占比低,但在全量放大后会集中出现。灰度阶段的价值不是证明“没问题”,而是尽早拿到一批可分类的失败样本。
处理前需要判断这个 404 属于哪种情况,因为对策不同:
一个可执行的判断动作:随机抽取若干条 404 记录,逐条用 curl -I 或浏览器开发者工具查看响应状态与响应头,确认是服务器返回的 404,还是页面内脚本渲染出的“找不到”提示。两者含义完全不同,后者可能实际返回的是 200。这个区分会直接决定下一步是改服务器配置、改模板,还是改内容链接。
在扩大流量前,可以做几件不依赖完整数据权限的事:
需要提醒的是:robots.txt 的抓取限制不等于可靠的索引移除,它只约束遵守规则的抓取行为,被限制抓取的 URL 仍可能以其他方式出现在结果中;站点地图不保证收录,提交与否和是否被索引是两件事。所以不要用“已加进站点地图”或“已写进 robots.txt”当作 404 处理完成的证据。
如果没有完整的访问日志或权限,只能拿到部分样本,那么可以得出的结论是:在已观测的样本范围内,这些路径返回 404。不能得出的是:全站只有这些 404、某个改动导致了 404 增加、或者修复后一定不再出现。统计上的数量变化与因果是两回事,需要额外的对照和复现才能靠近因果判断。
回到灰度这个场景:小流量灰度暴露的是“例外存在”的信号,而不是“例外清单完整”的证明。把它当作提前发现问题的抽样手段,而不是全量发布的通行证,才不会在流量放大后被动。下一步动作应是按已发现的例外类型逐类修复并重新抽样验证,确认分布收敛后再扩大流量,而不是仅凭 404 计数没有上升就全量切换。