Nginx可通过proxy_intercept_errors开启错误拦截,配合error_page实现状态码重写;需配置internal location处理映射,return指令指定新状态码与响应内容。

Nginx 本身不修改后端返回的状态码,但可以通过拦截 + 重写机制,让客户端收到你指定的状态码。核心是利用 proxy_intercept_errors 开启拦截能力,再配合 error_page 做状态码映射与响应替换。
启用错误响应拦截
必须在 location(或 server/http)块中显式开启,否则 Nginx 默认直接透传 4xx/5xx 状态码:
-
proxy_intercept_errors on;—— 这是前提,没有它,error_page对后端错误无效 - 仅当后端返回 ≥400 的状态码、且响应体非空时才触发拦截(空响应体默认不拦截)
- 若使用了
proxy_buffering off或小缓冲区,可能影响响应体读取,导致拦截失效
将特定状态码映射为新状态码
用 error_page 指令把原始状态码重定向到内部处理路径,并通过等号(=)实现状态码覆盖:
-
error_page 404 =200 /empty.json;→ 后端返回 404 时,Nginx 返回 200,并输出/empty.json内容 -
error_page 502 =500 /error.json;→ 把 502 改为 500,返回统一错误 JSON - 多个状态码可合并写:
error_page 500 502 503 504 = /api/error;
定义内部错误处理 location
被 error_page 指向的路径必须是 internal location,防止外部直接访问:
location = /api/error { internal; default_type application/json; add_header Content-Type "application/json; charset=utf-8"; return 500 '{"code":500,"msg":"service unavailable"}'; }-
internal是必需的,否则该路径可被用户直接请求,绕过拦截逻辑 -
return指令直接生成响应,状态码由其第一个参数决定(如return 500)
返回静态降级页或空响应
适用于前端友好型降级或 API 兼容性兜底:
- 返回本地 HTML 页面:
error_page 503 /503.html;,需确保root或alias正确指向文件路径 - 返回空响应并关闭连接(彻底拒绝):
error_page 403 =444;,444 是 Nginx 特有码,无任何响应体 - 注意:若省略等号(如
error_page 404 /404.html;),Nginx 默认仍返回 404 状态码,只是换内容


















