能改的只有请求到达应用之前或之后的那一层:反向代理、CDN、应用入口路由或数据层。模板改不了,不等于404只能放任;但调整边界很清楚——凡是必须由模板渲染出的内容替换、状态码重写、页面内跳转提示,基本都做不了,除非你愿意引入模板之外的输出通道。
遗留系统最常见的情况是:没人动过页面,但404日志持续增加。这时通常有两种解释。第一种是外部链接结构变了,比如旧栏目被下线、合作方换了跳转地址、站内某处硬编码链接指向了已删除的路径。第二种是内部路由或重写规则变了,比如应用升级后入口路由匹配顺序调整,原本能命中的路径落到了默认404处理器。
这两种解释的修复手段完全不同。前者要处理的是“让旧地址继续可用或体面退场”,后者要处理的是“把路由匹配改回来”。如果搞反方向,你会花大量时间在代理层加规则,而真正的问题在应用入口。
能区分它们的证据不是404数量本身,而是请求的命中位置和响应特征。可以按下面几步收集:
假设一个场景:某遗留系统的/old-api/前缀下所有路径都返回404,而/new-api/正常。如果代理日志显示/old-api/请求到达了应用,且应用日志里全部命中兜底路由,那基本可以判断是路由规则被替换,而不是外链问题。这个判断会直接决定你下一步是改代理重写还是改应用路由配置。
在确认问题层级后,可用的调整手段取决于你能接触到哪一层。以下动作不依赖模板:
这些动作的共同边界是:它们只改变“请求去哪”,不改变“页面长什么样”。如果业务方要求404页面显示推荐内容或搜索框,而模板改不了,那就不在可行范围内,除非引入模板之外的独立输出通道。
有几类操作在遗留系统里容易被误认为可行,但实际会带来新问题。第一类是在代理层把所有404统一重写到首页。这会让搜索引擎和用户都收到200状态码加首页内容,属于软404,后续排查真实404会变得更困难。第二类是依赖robots.txt阻止抓取来“修复”404。robots.txt的抓取限制不等于可靠的索引移除,已收录的URL仍可能出现在结果中,而且被阻止抓取后你更难看清楚这些路径的真实状态。
第三类是只提交站点地图就认为问题解决。站点地图不保证收录,它只是提示,不能替代对404路径的实际处理。第四类是假设HTTPS能顺带解决404或安全问题。HTTPS不保证安全无漏洞或排名,它和404处理是两件事。
判断是否越界有一个简单标准:这个动作是否让404路径的真实状态变得不可观测。如果答案是肯定的,就应该换一种做法。
在动手之前,先明确三件事:请求链路经过哪些层、每一层你是否有配置权限、模板之外是否有可写入的输出点。如果只有代理层权限,就把范围限定在重写和重定向;如果能改应用入口,就优先在入口做路由别名,减少代理层规则数量;如果连入口也改不了,就只能做数据层映射,并接受页面输出无法调整的现实。
每做完一个动作,回到日志确认该路径的响应码和命中位置是否按预期变化。如果响应码变了但目标页仍返回404,说明重写目标本身有问题;如果响应码没变,说明规则没生效或匹配顺序不对。这个验证步骤比一次性配置大量规则更可靠,也能避免在遗留系统里积累难以排查的重写链条。