Nginx的proxy_pass默认透传后端状态码,但可通过proxy_intercept_errors、proxy_redirect等指令干预;502/503/504由Nginx自动生成,499为Nginx特有状态码。

Nginx 的 proxy_pass 本身不修改后端返回的状态码,它默认将上游响应原样透传给客户端。但实际状态码是否被更改、如何被处理,取决于配置中是否启用相关指令以及后端行为本身。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
proxy_pass 基础透传机制
Nginx 作为反向代理,收到后端响应后,若未显式干预,会直接把状态码(如 200、404、502、503 等)连同响应头和正文一并返回给客户端。
这意味着:
- 后端返回 500,Nginx 就返回 500;
- 后端返回 302 并带
Location,Nginx 默认也透传该跳转; - 后端因超时或拒绝连接而无法响应,Nginx 则自行生成 502、503 或 504,而非转发任何状态码。
可主动干预状态码的常用方式
-
proxy_intercept_errors on+error_page
开启后,Nginx 会拦截后端返回的 4xx/5xx 响应(需配合error_page指令),转而返回自定义页面或重定向:proxy_intercept_errors on; error_page 502 /502.html; location = /502.html { internal; root /usr/share/nginx/html; } -
proxy_redirect控制跳转地址重写
当后端返回 301/302 且Location是内网地址(如http://127.0.0.1:8080/path),可通过proxy_redirect重写为公网可访问地址:proxy_redirect http://127.0.0.1:8080/ https://example.com/; # 或使用 default 自动替换 Host 和端口 proxy_redirect default;
-
add_header不影响状态码,但可补充响应头
比如统一添加 CORS 头或安全头,与状态码无关,但常与error_page配合使用:add_header X-Proxy "nginx";
fastcgi_intercept_errors(仅限 FastCGI)
类似proxy_intercept_errors,但专用于 PHP-FPM 等 FastCGI 场景,需搭配fastcgi_pass使用。
特殊状态码的典型来源
- 502 Bad Gateway:后端服务无响应(进程崩溃、端口未监听、超时)、或返回了非法 HTTP 响应(如空响应、格式错误)。
-
503 Service Unavailable:
upstream中 server 标记为down,或健康检查失败且无可用节点。 -
504 Gateway Timeout:后端响应时间超过
proxy_read_timeout或proxy_connect_timeout设置值。 - 400/404/499 等:多数来自后端应用本身;其中 499 是 Nginx 特有,表示客户端在 Nginx 发送响应前主动断开连接。
注意事项
-
proxy_hide_header可隐藏后端返回的特定响应头(如Server、X-Powered-By),但不影响状态码。 -
proxy_set_header只影响发往后端的请求头,对响应状态码无作用。 - 状态码逻辑发生在
proxy_pass执行后的响应阶段,与rewrite或return等指令互不干扰——除非return在location中提前终止流程。
不复杂但容易忽略。

















