Nginx 本身不支持状态码映射,需通过 proxy_intercept_errors on 配合 error_page 指令实现:如 error_page 502 = 503 /maintenance.html,将上游502转为503返回;error_page 仅对3xx–5xx错误码生效,不处理2xx/1xx;URI须有对应location处理,否则可能404。

Nginx 的 ngx_http_proxy_module 本身不提供“状态码映射”功能(即把上游返回的某个状态码自动转成另一个状态码),它只负责透传、缓存或根据配置做有限干预。真正的状态码转换需借助其他模块配合实现,核心依赖的是 error_page 指令和 proxy_intercept_errors 开关。
proxy_intercept_errors 控制是否拦截上游错误响应
默认值为 off,此时 Nginx 直接将上游返回的状态码(如 502、404、500)原样返回给客户端。
设为 on 后,Nginx 才会检查响应状态码是否落在 error_page 定义的范围内,并尝试用指定页面或指令接管处理流程。
- 仅对 300–399、400–499、500–599 范围内的状态码生效
- 若上游返回 2xx 或 1xx,即使配置了
error_page 200 = 503 /fallback.html,也不会触发(error_page不处理成功响应) - 开启后,若未匹配到任何
error_page,仍会透传原始响应
error_page 实现状态码“重写”效果
error_page 本质是错误响应的重定向/内部重写机制,通过 = 语法可实现“返回指定状态码 + 内容”:
-
error_page 502 = 503 /maintenance.html;:上游返回 502 时,Nginx 改用 503 状态码返回/maintenance.html内容 -
error_page 404 =200 /default.json;:上游 404 变成 200,返回 JSON 文件(注意=200中等号后不能有空格) - 支持多状态码映射:
error_page 500 502 503 504 = 503 /err.html;
⚠️ 注意:error_page 后的 URI 必须能被当前 location 或全局配置处理(比如存在对应 location 块或 root 设置),否则可能返回 404。
配合 proxy_redirect 调整响应头中的 Location
当上游返回 3xx 重定向且你用 error_page 拦截后,原始 Location 头仍存在。若需修改跳转地址,需用 proxy_redirect:
proxy_redirect https://api.example.com/ https://cdn.example.com/;-
proxy_redirect default;:按proxy_pass规则自动重写(常用) - 若已用
error_page将 302 改为 200,则Location头不再生效,无需处理
替代方案:map 模块 + return(适用于简单逻辑)
若只需根据上游响应头(如 Content-Type)或变量间接判断状态码,可用 map 配合 return,但无法直接读取上游状态码 —— 因为 $upstream_http_* 变量在 return 执行时不可用。真正能获取上游状态的是 $upstream_status,但它只能在日志、if 判断或 error_page 上下文中使用:
- 可在
log_format中记录:log_format main '$upstream_status $status ...'; - 可在
if ($upstream_status = "502") { return 503; },但return在 if 中有严格限制(仅限于 server 和 location 级,且不能含复杂逻辑) - 更可靠的方式仍是
proxy_intercept_errors on+error_page

















