必须配对使用 proxy_intercept_errors 和 error_page 才能劫持错误页面,否则无效;需确保错误页存在、设置 internal 防直访、隐藏敏感响应头,才能防止堆栈信息泄露。

直接开启 proxy_intercept_errors on 并不能“劫持”错误页面,它只是一个开关——真正起作用的是配合使用的 error_page 指令。防止堆栈信息泄露的关键,是让 Nginx 在后端返回 500/502 等错误时,不把原始响应(含 PHP/Java 堆栈、调试路径、框架版本)透传给用户,而是换成你可控的静态页。
必须配对使用 proxy_intercept_errors 和 error_page
单独写 proxy_intercept_errors on; 完全无效。你需要在同一个 location 块中紧跟着定义要接管的状态码:
proxy_intercept_errors on;-
error_page 500 502 503 504 /50x.html;(覆盖所有常见服务端错误) - 确保
/50x.html文件真实存在,且能被 Nginx 正确读取(例如放在/usr/share/nginx/html/下)
防止堆栈泄露的核心细节
即使配了上面两行,仍可能失败。注意以下三点:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
响应体大小门槛:Nginx 默认只拦截响应体 ≥512 字节的错误响应。若后端返回极简文本(如
502 Bad Gateway),可能被跳过。解决办法:让后端返回带 HTML 的 body(哪怕只有<p>Service unavailable</p>),或在响应头中显式设置Content-Length -
禁止用户直访错误页:为安全起见,所有降级页的 location 必须加
internal;,例如:location = /50x.html {<br> root /usr/share/nginx/html;<br> internal;<br>}
否则攻击者可直接请求/50x.html绕过业务逻辑,还可能暴露路径结构 -
隐藏后端标识头:额外加上这几行,避免泄露技术栈:
proxy_hide_header X-Powered-By;<br>proxy_hide_header X-Debug-Info;<br>proxy_hide_header Server;
验证是否生效的最简方式
用 curl 模拟后端错误,观察实际返回:
- 临时停掉后端服务,再请求接口;
- 执行
curl -i http://your-domain/api/test; - 确认响应状态码仍是 502,但 body 是你配置的
/50x.html内容,且没有堆栈、没有X-Powered-By等头字段。
做到这三步,后端应用的原始错误页和堆栈信息就基本不会外泄了。重点不是“拦截”,而是“替换+屏蔽+隔离”。

















