nginx可通过error_page拦截后端错误状态码并重定向至内部location,结合return指令返回统一json格式错误响应,支持按502/504等类型精细化映射不同code与message,且需启用proxy_intercept_errors。

通过 Nginx 代理实现后端服务的统一错误码转换,核心在于拦截后端返回的原始错误响应,重写其状态码和响应体,使其符合前端或网关层约定的统一格式。这不依赖后端修改,适合多语言、多团队协作场景。
利用 error_page 拦截并重定向错误响应
Nginx 的 error_page 指令可捕获 upstream 返回的特定 HTTP 状态码(如 500、502、503、504),并将其重定向到内部 location 进行处理。这是实现错误码转换的基础机制。
- 在 proxy_pass 所在的 server 或 location 块中配置:
error_page 500 502 503 504 = /_error; - = 表示内部重定向(不改变客户端看到的状态码),后续由 /_error location 处理并返回新响应
- 确保 /_error 是内部 location(以 internal; 声明),防止外部直接访问
用自定义 location 构建标准化错误响应
在 /_error location 中,可通过 add_header、return 或 sub_filter 控制输出内容,实现状态码与响应体的统一转换。
- 使用 return 直接返回标准 JSON 错误格式:
location = /_error {
internal;
add_header Content-Type "application/json; charset=utf-8";
return 200 '{"code":50001,"message":"服务暂时不可用","data":null}';
} - 若需保留部分原始错误信息(如日志 ID),可用 $upstream_http_x_request_id 等变量拼接
- 避免使用 sub_filter 修改原始响应——它无法可靠处理二进制或流式响应,且对非文本类型易出错
区分不同后端错误类型,做精细化映射
单一 error_page 无法区分 502(连接失败)和 504(超时),但可通过 upstream 模块配合 variables 实现差异化处理。
- 为不同后端定义独立 upstream,并设置不同的 proxy_next_upstream 和 proxy_next_upstream_tries
- 在 error_page 后接命名 location,例如:
error_page 502 = @backend_down;
error_page 504 = @backend_timeout; - 每个命名 location 返回对应语义的错误码:
location @backend_down { internal; return 200 '{"code":50002,"message":"上游服务离线"}'; }
location @backend_timeout { internal; return 200 '{"code":50003,"message":"请求超时"}'; }
补充:透传原始错误上下文(可选)
某些场景需要将原始错误原因传递给前端(如调试),可在统一错误体中嵌入原始状态码或简要说明,但不暴露敏感信息。
- 启用 proxy_intercept_errors on;(默认 off),否则 error_page 不生效
- 用 add_header X-Origin-Status $upstream_status; 透传原始状态码(仅用于调试,生产建议关闭)
- 禁止在错误响应中返回后端堆栈、路径、服务器版本等敏感字段











