proxy_intercept_errors需与error_page配合使用才能生效,单独开启无效;必须同时满足proxy_intercept_errors on和显式配置error_page绑定具体错误码两个条件。

要让 proxy_intercept_errors 真正发挥作用,关键不是单独开启它,而是和 error_page 配合使用,形成一套可控的错误拦截与降级机制。它本身不生成页面、不跳转、也不重试,只负责“把后端返回的 502/504 这类错误交出来”,后续怎么处理,全靠你配置的 error_page。
必须同时满足两个条件
缺一不可,否则配置无效:
-
开启拦截开关:在对应作用域(
http、server或location)中设置proxy_intercept_errors on; -
显式绑定错误码:用
error_page 502 504 = @fallback;这类语句,把具体状态码指向一个内部 location 或 URI
基础降级页配置示例
这是最常用也最稳妥的方式,所有 502/504 统一返回静态 HTML 页:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
location / {
proxy_pass http://backend;
proxy_intercept_errors on;
error_page 502 504 = @fallback;
}
location @fallback {
internal;
root /usr/share/nginx/html;
try_files /fallback.html =404;
}
注意:internal 确保该 location 无法被外部直接访问;= @fallback 中的等号表示内部重定向并保留原始状态码(如仍返回 502),如果想统一返回 200,可写成 =200 @fallback。
按业务路径差异化降级
不是所有接口都适合同一张降级页。比如支付路径出错要提示“支付暂时不可用”,而商品页出错可显示“商品信息加载中”:
- 为特定路径单独定义:
location /api/pay { error_page 502 504 = @pay_fallback; } - 用
map指令根据上游地址动态选页,适合多集群部署:map $upstream_addr $fallback_path {<br> ~10\.0\.1\.10:8080 "/fallback-core.html";<br> ~10\.0\.1\.11:8080 "/fallback-user.html";<br> default "/fallback-generic.html";<br> }
再配合error_page 502 504 = @dynamic_fallback;和内部 location 中的rewrite实现路由
避免常见陷阱
很多配置看似正确却无效,往往卡在这几个点上:
-
proxy_intercept_errors on但没配error_page→ Nginx 仍直接透传后端错误响应,不走自定义逻辑 - 后端返回的错误响应体为空(比如只返回 502 状态头,没 body)→
proxy_intercept_errors不触发,error_page不生效 - 用了
proxy_next_upstream http_502 http_504→ Nginx 会先尝试重试,可能根本不会走到error_page阶段 - 降级页路径写错或文件不存在 → 返回 404,而不是你期望的降级内容










