灰度阶段只抽查少量URL,通常只能证明这些URL当前可达,不能证明全量发布后所有入口都不会返回404。真正暴露例外的,往往是灰度未覆盖的旧链接、参数化URL、大小写变体、尾斜杠变体,以及从列表页进入详情页的深层路径。解决顺序应是:先判断404是“该消失”还是“不该消失”,再决定用重定向、保留页面还是返回410,最后把灰度样本从“随机少量”改成“按URL模式分层覆盖”。
全量发布后出现404,第一件事不是批量跳转,而是判断这个URL是否应该继续存在。两类情况的处理代价完全不同。
判断依据可以来自服务器访问日志、站点地图、内部链接抓取结果和CMS里的发布记录。如果只凭“这个路径看起来像旧的”就批量301,容易把大量无意义参数URL也跳到一个页面,反而制造软404式的混乱。
小流量灰度常见的失误是“随机抽10个URL都正常,就认为全量没问题”。随机抽样适合发现整体可用性,不适合发现模式性例外。更有效的做法是按URL模式分层,而不是按流量比例分层。
这样做的直接结果是:灰度不再只回答“站点活着吗”,而是回答“哪些URL模式会在全量后返回404”。下一步就能针对具体模式修规则,而不是全站回滚或盲目加跳转。
发现404后,常见两种做法:一是加一条全站兜底规则,把所有404都跳到首页或某个栏目页;二是逐条确认并精确重定向或保留。两者成立的条件不同。
适合全站兜底的条件:站点规模小、旧链接数量有限、404路径与现有内容没有明确对应关系,且团队没有精力逐条维护映射。代价是用户和搜索引擎看到的是“所有错误都去同一个地方”,原本有明确对应关系的内容会丢失,后续再想拆分映射会更麻烦。
适合逐条精确处理的条件:URL有稳定结构、旧新路径存在可推导的对应关系、站点地图和访问日志能提供依据。代价是需要维护映射表,发布流程中要增加一步校验。
一个可操作的折中是:对能推导出对应关系的路径做精确301,对无法对应的路径返回404或410,而不是全部跳首页。执行后观察服务器日志中这些路径的后续请求情况。如果某条精确301的目标页仍然收到大量404,说明映射选错了,应回到映射表修改,而不是再加一层兜底。
假设某站点改版,灰度阶段只测了首页和三个热门详情页,全部返回200,于是全量发布。发布后日志显示,旧版栏目分页路径开始大量返回404,因为新路由不再支持/list/page/2这种形式。
此时可做的动作是:从日志中提取返回404且带分页特征的路径,确认它们对应的新分页URL规则,再为这些路径配置301到新分页。配置后重新抓取同一批路径,确认状态码变为301且最终页可访问。如果仍有404,继续检查是否是大小写或尾斜杠差异,而不是直接加全站跳转。
这个例子的数字仅用于说明比较方法:灰度覆盖的URL数量不等于覆盖的URL模式数量。覆盖模式比覆盖数量更能暴露全量发布后的例外。
配置重定向或返回410后,如果某段时间内该路径的请求量下降,不能单独证明处理正确。请求量下降还可能是因为:外部链接自然失效、抓取频率调整、日志采样变化,或用户本来就不再访问。要结合状态码分布、目标页可达性和内部链接抓取结果一起判断。
另外,robots.txt中的抓取限制不等于可靠的索引移除;站点地图提交不保证收录;HTTPS也不保证页面无漏洞或排名提升。若404涉及搜索引擎中的已收录URL,应分别核查不同搜索引擎的支持情况和处理周期,不要假设一处配置对所有引擎同时生效。把这些信号放在一起看,才能决定下一步是继续修映射、补内链,还是接受该URL应当消失。