识别 404 配置冲突,关键是看同一个请求在到达 404 页面前经过了哪些规则,再比较这些规则对同一路径给出的结论是否相反。最容易被忽略的冲突是:重写规则把请求改到新地址,而重定向规则又把它送回旧地址;或者服务器已经返回 404,前端路由却仍尝试渲染页面。判断方法不是猜哪条规则有问题,而是按请求路径逐层核对,找到第一个与预期不符的环节。
同一份配置里,不同规则可能都执行了,只是结果互相抵消。开始检查前,先写清一个具体路径的预期:它应该返回 200、301、302 还是 404。没有这个基准,看到日志里出现 404 也不能说明是冲突。
例如假设有一个地址 /old-page,业务上希望它永久跳到 /new-page。那么判断标准就是:请求 /old-page 时,最终响应应为 301,且目标为 /new-page。如果实际先跳一次、再回到 404,冲突就出现了。这个例子只用于说明判断方法,不代表任何真实站点数据。
时间有限时,优先检查三类路径:曾经改版过的栏目页、带参数的商品或文章页、以及大小写或末尾斜杠不一致的地址。它们最容易同时命中重写、重定向和 404 规则。
配置冲突通常不是某一条规则写错,而是多层规则对同一路径都生效。可以按下面顺序检查:
比对时不要只看规则名称,要看匹配条件和执行顺序。两条规则都写“匹配 /old”,一条指向新地址,一条指向 404 页面,就是典型冲突。若一条规则使用精确匹配,另一条使用前缀匹配,前缀规则可能先截走请求,精确规则永远不会执行。
下面这些检查项可以直接执行,不需要完整日志平台:
curl -I https://example.com/old-page。把 example.com 换成待检查域名,只作为格式示例。这些检查的适用条件是:你能修改或至少查看配置。若只能看到最终页面,无法看到响应头和跳转链,就只能判断“结果异常”,不能断定冲突位置。判断结果时,以最终响应状态码和最终 URL 是否同时符合预期为准,不能只看页面是否显示正常。
看到 404 不等于配置冲突。可能原因包括:文件确实不存在、规则写错、规则顺序不对、缓存返回旧结果、或者多个系统同时处理同一路径。只有当你确认两条以上规则对同一路径给出相反结论,并且复测结果随规则调整而变化,才能说已经定位到冲突。
另一个常见误区是把 robots.txt 的抓取限制当成索引移除手段。robots.txt 只影响抓取,不保证页面从搜索结果消失;它和 404 配置冲突不是同一类问题。站点地图也不保证收录,HTTPS 也不保证安全无漏洞或排名提升,这些都不能用来替代对 404 链路的检查。
如果同一路径在不同搜索引擎或不同客户端表现不同,要分别核查。有的客户端会缓存重定向,有的不会;有的搜索引擎对 404 和软 404 的处理方式不同。不要用一次请求的结果推断所有环境。
时间和人手有限时,先处理同时满足两个条件的路径:有外部链接或站内入口指向它,并且当前返回 404。这类路径影响面最大,修复后可以直接复测。
处理顺序建议为:先修服务器层重定向冲突,再修应用路由冲突,最后处理前端路由与状态码不一致。每修一项,就用同一路径复测一次,记录状态码、跳转目标和最终页面。若复测后仍返回 404,再检查缓存是否返回旧结果,而不是继续叠加新规则。
下一步可以直接做一件事:选一个已知异常的旧地址,用 curl -I 连续请求两次,把两次的状态码和 Location 响应头抄下来。对比这两次结果与配置中的规则顺序,就能判断冲突发生在服务器、应用还是缓存层。