proxy_intercept_errors on 必须与 error_page 配合使用才能实现 5xx 友好提示,需同在 location 块中;/5xx-fallback.html 是 uri 路径,须用 internal 限制直接访问,并确保文件存在、轻量、可读;nginx 默认仅拦截 ≥512 字节的 5xx 响应,可通过后端返回 html 或 proxy_buffering off 解决;error_page 默认返回 200,可用 =502 保留原始状态码。

proxy_intercept_errors on 本身不捕获也不重构,它只是打开一个“允许接管”的开关。真正实现 5xx 友好提示,靠的是它和 error_page 的配合闭环——开关开了,还得有页面、有路径、有服务逻辑。
必须配对启用:开关 + 映射
只写 proxy_intercept_errors on; 没用。必须在同一作用域(比如同一个 location 块)里同时存在:
proxy_intercept_errors on;error_page 500 502 503 504 /5xx-fallback.html;
这个 /5xx-fallback.html 是 URI 路径,不是文件系统路径。Nginx 会按常规请求流程去匹配它,所以你得确保有对应 location 能把它正确返回。
让降级页真正可用且安全
直接把 HTML 放在 root 目录下还不够,得用 internal 防止用户绕过业务直接访问:
location = /5xx-fallback.html {
internal;
root /usr/share/nginx/html;
}
这样:
- 用户访问
/5xx-fallback.html会被拒绝(404 或 403) - 但
error_page内部跳转时可以正常读取并返回
同时确保该 HTML 文件真实存在、权限可读,内容建议轻量:内联 CSS、无外部 JS/图片依赖,文案写“服务暂时不可用,请稍后再试”比“502 Bad Gateway”友好得多。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
注意响应体是否达标,否则拦截失效
Nginx 默认只拦截响应体长度 ≥ 512 字节的 5xx 响应。如果后端返回极简错误(如纯文本 502 Bad Gateway),可能被跳过。
解决办法有两个:
- 让后端返回带 HTML body 的响应(哪怕
<p>Service unavailable</p>) - 或在 Nginx 中加
proxy_buffering off;强制读取完整响应(调试时可用,生产慎用)
别漏掉状态码继承问题
默认 error_page 502 /5xx-fallback.html; 返回的是 200 状态码(因为返回的是静态页)。如果希望仍显示 502,可用:
error_page 502 =502 /5xx-fallback.html;
等号后的 =502 表示保留原始状态码,浏览器 DevTools Network 标签里看到的就是 502,但内容是你定制的 HTML。
不复杂但容易忽略










