Nginx 通过 proxy_intercept_errors on 配合 error_page 指令可拦截后端返回的 502/503/504 等状态码并返回预置静态降级页,前提是后端真实返回对应状态码而非仅内容错误,且静态页路径需正确配置于 root 下。

Nginx 的 proxy_intercept_errors 指令配合自定义错误页,可以实现在后端返回特定 HTTP 状态码(如 502、503、504)时,不直接透传错误给客户端,而是由 Nginx 主动拦截并返回预置的静态降级页面。关键在于正确启用拦截、配置错误页映射,并确保后端真实返回对应状态码(而非仅返回内容但状态码仍是 200)。
开启拦截并关联错误页
在 location 块中启用拦截,并用 error_page 指令将状态码映射到本地静态文件路径:
-
proxy_intercept_errors on;:必须开启,否则 Nginx 不会拦截后端返回的错误响应体 -
error_page 502 /502.html;:将后端返回的 502 映射到根目录下的/502.html -
error_page 503 /503.html;:同理,支持多个状态码分别指定不同页面 - 静态页需放在
root或alias指定的本地路径下,且路径以/开头表示相对于该 root
确保后端真实返回目标状态码
proxy_intercept_errors 只对响应头中的 Status(即 HTTP 状态码)起作用,不会分析响应体内容:
- 若后端出错但仍返回
200 OK+ 错误 HTML,Nginx 不会触发拦截 —— 必须让后端主动设置502/503/504等状态码 - 常见场景:上游服务不可达(Nginx 自动发 502)、上游超时(504)、上游明确返回 503(如主动熔断)
- 可通过
curl -I http://your-proxy/验证后端是否真返回了目标状态码
避免常见配置陷阱
以下问题会导致降级页无法生效:
-
proxy_intercept_errors默认为off,未显式开启则始终透传 -
error_page指令需写在启用proxy_intercept_errors的同一 location 内,或其上级作用域(如 server 块),否则不生效 - 静态页路径未被 Nginx 正确找到(如权限不足、路径拼错、未配置
root),此时 Nginx 会返回默认 50x 页面 - 若使用
try_files或其他重写逻辑,可能覆盖error_page行为,需注意执行顺序
进阶:按状态码动态选页 + 自定义响应头
可结合 map 指令实现更灵活控制,例如统一入口、差异化响应头:
- 在 http 块中定义 map:
map $upstream_http_content_type $error_page_path {
default "/50x.html";
"text/html" "/50x.html";
}
再配合error_page 502 = @fallback;和内部 location 处理逻辑 - 用
add_header为降级页添加X-Downgraded: true等标识,便于前端识别 - 若需透传部分上游响应头(如
X-RateLimit-Remaining),需在 error_page 对应 location 中手动add_header设置


















