proxy_intercept_errors 是拦截开关,必须与同作用域的 error_page 503 /maintenance.html 配合使用,通过 internal location 提供静态页并可选用 =200 统一返回 200 状态码。

Nginx 的 proxy_intercept_errors 可以让 Nginx 拦截后端返回的错误响应(如 502/503/504),转而返回自定义错误页。要将后端返回的 503 状态码统一重定向到一个全量维护页(例如 /maintenance.html),关键在于正确启用拦截、配置错误页映射,并确保该页面能被 Nginx 直接服务。
启用 proxy_intercept_errors 并设置 error_page
在 location 块中开启拦截,并为 503 显式指定跳转目标:
location / {
proxy_pass http://backend;
proxy_intercept_errors on; # 必须开启,否则不拦截
error_page 503 /maintenance.html; # 拦截到 503 后内部重写到该路径
}注意:error_page 503 /maintenance.html 是内部 URI 重写,不是 HTTP 302 跳转,客户端看到的仍是 503 状态码(除非额外用 error_page 503 =200 /maintenance.html 覆盖状态码)。
提供可直接访问的维护页资源
确保 /maintenance.html 能被 Nginx 正常提供(不经过 proxy):
- 把维护页放在
root指定的静态目录下(如/usr/share/nginx/html/maintenance.html) - 或单独配一个 location 处理该路径,避免循环代理:
location = /maintenance.html {
root /usr/share/nginx/html;
internal; # 仅限内部 error_page 调用,禁止外部直接访问
}可选:统一返回 200 状态码提升体验
运维页面通常希望用户看到的是 200 OK,而非 503 Service Unavailable(避免被搜索引擎降权或触发监控误报):
error_page 503 =200 /maintenance.html;
其中 =200 表示将响应状态码强制改为 200,同时仍返回维护页内容。
验证与调试要点
- 确认后端真实返回 503(可用
curl -I验证原始响应) - 检查 Nginx 错误日志(
error_log),若出现upstream sent no valid HTTP/1.0 header,可能是后端未输出完整响应头 - 确保
proxy_intercept_errors在生效的 location 或 server 块中,且未被子块覆盖 - 若维护页含 CSS/JS,需确保这些静态资源路径正确,或一并配置
location ~ \.(css|js|png)$规则











