404 not found 的意思是:服务器收到了请求,但找不到与这个 URL 对应的资源。放到测试环境和线上环境对照时,真正要判断的不是“哪边也报了 404”,而是两边请求的是不是同一个 URL、命中的是不是同一套路由与资源。常见误解是:测试环境正常、线上 404,就一定是线上服务器坏了。实际上更常见的原因是两边配置不同,导致同一个路径被解析成了不同结果。
404 可能来自应用本身,也可能来自反向代理、CDN 或静态资源服务器。测试环境往往直接访问应用端口,线上则经过域名、代理和缓存层,所以同一路径的表现可能不同。
判断方法:查看响应头中的 Server、X-Powered-By 等字段只能作为线索,不能单独定论。更可靠的是对比两边响应体的错误页样式:应用自定义 404 页通常带自身模板特征,网关默认 404 页往往更简单。
不要用浏览器地址栏随手输入来对比,因为浏览器可能补全路径、跟随跳转或使用缓存。应该用同一组请求分别打到两个环境。
curl -i 分别请求测试与线上,保存状态码、响应头和响应体。适用条件:两边代码版本接近,差异主要在配置。如果代码版本本身不同,应先确认测试环境是否包含线上已有的路由。判断结果:若测试返回 200、线上返回 404,且请求 URL 完全一致,则优先排查线上代理规则与发布产物;若两边都 404,则回到应用路由或资源路径本身。
robots.txt 的抓取限制不等于可靠的索引移除。它只能阻止合规爬虫抓取,不能保证已经收录的 URL 从搜索结果消失,也不能让用户访问时不再看到 404。测试环境如果误开放抓取,线上又用 robots.txt 屏蔽,可能出现“测试能访问、线上搜不到”的混淆现象,但这与 404 本身是两件事。
同理,站点地图不保证收录,HTTPS 也不保证页面一定可访问或排名更好。排查 404 时应把抓取、索引和访问可用性分开看。
/Page 和 /page 在某些服务器上是两个资源。下一步:选取一个线上返回 404 的具体 URL,用 curl -i 保存完整响应,再对测试环境发同样的请求,把两份响应并排比较。先确认差异出现在状态码、跳转还是响应体,再决定改路由、改代理还是补发资源。