启用 proxy_intercept_errors on 后,Nginx 可拦截上游 4xx/5xx 错误并返回本地静态错误页;需确保后端响应体非空、正确配置 error_page 路径及静态资源,通过日志和 curl 验证生效。

通过启用 proxy_intercept_errors on,Nginx 可以捕获上游(如后端应用服务器)返回的 4xx/5xx 错误响应,并将其重定向到本地定义的错误页面,从而实现静态错误页的统一视觉风格控制。
启用拦截并指定错误页路径
在 server 或 location 块中开启拦截,并为常见错误码绑定本地 HTML 文件:
-
proxy_intercept_errors on;必须开启,否则 Nginx 直接透传上游错误响应,无法接管渲染 -
error_page 404 /static/404.html;指向你已准备好的统一风格静态页(建议放在/usr/share/nginx/html/或 alias 映射路径下) - 支持多个码:如
error_page 500 502 503 504 /static/5xx.html;,复用同一套 UI 设计
确保上游错误响应可被拦截
Nginx 默认只拦截 HTTP 状态码 ≥ 400 且响应体长度 > 0 的响应。需注意:
- 后端返回空响应体(如仅 status=500,body="")时,Nginx 不会触发
error_page,需让后端至少返回一个字节(例如{"error":"internal"}或单个空格) - 若后端设置了
Content-Length: 0或使用 chunked 编码但未发送数据,也会影响拦截,可在 Nginx 中加proxy_buffering off;测试确认 - 避免后端设置
Cache-Control: no-cache或Vary头干扰,拦截行为与缓存逻辑无关,但某些代理链路可能有副作用
静态页资源需独立托管且路径正确
统一风格依赖 CSS、图标、字体等资源加载正常:
- 推荐将错误页及配套资源(
/static/404.html、/static/css/error.css、/static/img/logo.svg)放在 Nginx root 下,用相对路径引用 - 若使用绝对路径(如
/css/error.css),需确保对应 location 存在,例如:location /css/ { alias /usr/share/nginx/html/static/css/; } - 避免在错误页中请求动态接口或跨域资源,静态页应完全离线可用
配合 custom\_log 和状态码统计做效果验证
上线后需确认是否真正生效:
- 查看 access log,原应返回 502 的请求现在是否显示为 200(因返回了你的 404.html 页面);可通过
$status和$upstream_status变量区分 - 临时添加日志:
log_format debug_log '$status $upstream_status $request';,观察拦截前后状态变化 - 用 curl 测试:
curl -I http://your-site/nonexistent,检查响应头中Content-Type: text/html和实际返回内容是否为你设定的页面


















