把同一个404页面的URL分别放到测试环境和线上环境请求一次,记录HTTP状态码、响应头和返回内容,再对比两边的服务器配置与路由规则。对照的核心不是看页面长得像不像,而是确认两边对“不存在的地址”给出的状态码是否一致、是否被正确识别为404,以及线上是否因为CDN、重写规则或兜底路由把404变成了200。只要其中一项不同,就需要先定位差异来源,再决定改哪一侧。
测试环境与线上环境往往域名不同、路径前缀不同,直接拿两个不同URL对比没有意义。正确做法是选定一个在两边都应当返回404的路径,例如一个不存在的文章别名或一个已删除的栏目地址,然后分别在两边发起请求。
Content-Type、Location、Cache-Control。如果测试环境需要Host绑定或通过内网IP访问,要在记录里写清楚访问方式,否则后续无法复现。对照的前提是两次请求除环境本身外,其他条件尽量相同。
404页面的关键信号是HTTP状态码。测试环境返回404、线上返回200,说明线上很可能配置了“软404”或前端路由兜底,把不存在的路径交给了首页或列表页。反过来,测试环境返回200、线上返回404,则可能是测试环境缺少对应的路由或重写规则。
响应头里还要看几个位置:
Location:如果出现,说明发生了跳转,需要确认跳转目标是404页还是其他页面。Content-Type:404页面通常返回text/html;如果返回JSON或纯文本,说明该URL被接口或中间件接管。Cache-Control:如果404被长时间缓存,后续修改可能不会立即生效,需要清理缓存后再对照。判断结果时,状态码一致且都为404,才可以认为两边行为基本一致;状态码不同,先不要改页面模板,先查服务器和路由配置。
浏览器看到的结果可能经过前端渲染或CDN处理,不一定等于服务器原始返回。更可靠的方式是查看服务器访问日志,或使用命令行工具直接请求,例如:
curl -I https://线上域名/不存在的路径
这条命令返回的响应头可以反映服务器直接给出的状态码。如果curl -I显示404,而浏览器显示200,说明差异出在前端路由或CDN层;如果两者都显示200,说明服务器配置本身就没有返回404。
测试环境同样用curl -I请求一次,把两边输出并排对比。日志中还要留意请求是否被重写到其他文件、是否命中了默认的index.html。这些记录比页面截图更能说明问题。
对照之后通常会出现几种情况,处理方式不同:
如果线上使用了CDN或缓存层,修改配置后要先清理对应URL的缓存,再重新请求对照,否则看到的仍是旧结果。robots.txt的抓取限制不等于可靠的索引移除,站点地图不保证收录,这些与404状态码的对照是不同层面的问题,不要混在一起判断。
为了让每次排查都有依据,可以固定一套最小检查项:同一个不存在路径,分别在测试环境和线上执行curl -I;记录状态码、Location、Content-Type;查看两边服务器访问日志中该请求的原始处理结果;确认CDN缓存是否命中。四项都记录后,再判断差异出在服务器、路由还是缓存层。
下一步,选一个当前线上确实返回404的URL,按上面的检查项在测试环境请求一次,把两边结果并排写下来。如果状态码不一致,先查配置差异,不要急着改404页面模板。