Nginx中4xx/5xx状态码不会自动重定向,需配合error_page指令与fastcgi_intercept_errors或proxy_intercept_errors启用错误拦截,再配置内部跳转、静态页或外部重定向实现相应处理。

在 Nginx 中,4xx 和 5xx 状态码本身不会自动重定向,它们是响应状态,不是跳转指令。要实现“重定向效果”,需结合 error_page 指令 + 自定义响应(如返回 HTML 页面、内部跳转或外部重定向),并确保相关拦截机制已启用。
启用错误拦截:fastcgi_intercept_errors 与 proxy_intercept_errors
这两个指令决定 Nginx 是否接管后端返回的错误响应:
-
fastcgi_intercept_errors on;:用于 FastCGI 场景(如 PHP-FPM),让 Nginx 拦截 4xx/5xx 响应,交由
error_page处理 - proxy_intercept_errors on;:用于反向代理场景(如转发到 Tomcat、Node.js),仅当后端返回非空体的 4xx/5xx 时才触发拦截
- 两者都必须放在
http{}、server{}或location{}块中,且默认为off
绑定错误码到自定义响应:error_page 指令
error_page 是核心配置,它把状态码映射到具体动作:
- 指向本地静态页:
error_page 404 /404.html;,再配合location = /404.html { root /usr/share/nginx/html; internal; } - 跳转到内部 URI(可被 rewrite 或 proxy_pass 处理):
error_page 502 /fallback;,然后用location /fallback { return 302 https://backup.example.com/; } - 直接返回重定向响应:
error_page 403 =302 https://login.example.com/?r=$request_uri; - 支持多个状态码共用一个处理路径:
error_page 500 502 503 504 /50x.html;
注意内部跳转与外部重定向的区别
行为差异直接影响客户端感知和日志记录:
- 使用
=301或=302后接 URL(如=302 /maintenance或=302 https://...)会真实发起 HTTP 重定向,浏览器地址栏变化,access log 记录两次请求 - 不带等号的路径(如
error_page 404 /404.html)是内部重写,客户端无感知,只记录一次请求,且需加internal;防止被直接访问 - 若想对 502/504 统一降级到静态页,必须同时开启
proxy_intercept_errors on并显式绑定error_page 502 504 /down.html;
验证与调试要点
配置生效前需确认几个关键点:
- 执行
nginx -t确保语法正确,再nginx -s reload生效 - 检查 error.log 是否输出类似
error_page directive is not active的警告——说明对应拦截指令未开启 - 测试时用 curl 加
-v查看实际响应状态码和 Location 头,避免被浏览器缓存干扰 - 若后端返回空响应体(如 502 但 body 为空),
proxy_intercept_errors不会触发,此时需靠 upstream 检测或健康检查提前规避


















