ProxyErrorOverride On 配合 ErrorDocument 可统一接管后端返回的 5xx 错误页,如配置 ProxyErrorOverride On 和 ErrorDocument 502 /errors/50x.html,Apache 将丢弃后端原始响应,改用本地页面并保持状态码。
apache 的 mod_proxy 本身不提供“统一异常捕获”能力(如自动拦截 500/502/503 并跳转页面),它只负责转发请求和回传响应。但你可以在虚拟主机(virtualhost)层级,通过组合 proxypass、errordocument 和 mod_rewrite 实现对后端故障的感知与用户侧友好重定向——关键在于把错误响应“暴露”给 apache 处理,而不是直接透传给浏览器。
确保后端错误能被 Apache 拦截
默认情况下,当后端返回 5xx 错误时,mod_proxy 会原样转发状态码和响应体,ErrorDocument 不生效。要让 Apache 接管处理,必须满足以下任一条件:
- 后端服务返回的错误页带有明确的
Content-Type: text/html且响应体包含可识别的错误标识(如),此时可配合502 Bad Gateway mod_substitute或自定义响应头触发重写 - 更可靠的方式:在代理配置中启用
ProxyBadHeader Ignore(非必需),并配合RewriteCond %{REQUEST_STATUS} ^5——但注意:%{REQUEST_STATUS}在RewriteCond中不可用;真正可用的是%{ENV:REDIRECT_STATUS},它仅在内部重定向后设置,不适用于代理失败场景 - 推荐做法:让后端在出错时返回一个特殊 HTTP 头(例如
X-Backend-Error: true),然后用mod_headers+mod_rewrite检测该头并触发重定向
用 ErrorDocument 拦截已知代理错误码
ErrorDocument 对 mod_proxy 产生的部分错误是有效的,尤其是连接类失败:
-
ErrorDocument 502 /error/502.html:当 Apache 无法连接后端(Connection refused、timeout)时,会返回 502,此时该配置生效 -
ErrorDocument 503 /error/maintenance.html:配合ProxyPass ... retry=60,后端宕机期间 Apache 主动返回 503,可被接管 -
ErrorDocument 504 /error/timeout.html:超时未收到后端响应时触发(需设置ProxyTimeout) - ⚠️ 注意:
ErrorDocument 500不会拦截后端返回的 500,除非你用ProxyErrorOverride On(见下一点)
启用 ProxyErrorOverride 实现后端 5xx 的接管
这是最直接有效的方式,让 Apache 替换后端返回的 5xx 错误页:
- 在虚拟主机内添加:
ProxyErrorOverride On - 配合标准
ErrorDocument指令,例如:ErrorDocument 500 /error/internal-server-error.html - Apache 将丢弃后端返回的原始 500 响应体,改用你指定的本地 HTML 文件,并保持状态码为 500(或你重写的任意码)
- 支持所有 5xx 状态码,无需逐个判断后端行为,真正实现“统一”处理
补充:用 RewriteRule 做细粒度重定向(可选)
若需根据后端响应头或 URL 特征做条件跳转(比如 /api/ 出错跳 API 维护页,/web/ 出错跳首页),可在 ProxyPass 后追加重写逻辑:
- 先用
ProxyPass /api/ http://backend/api/ connectiontimeout=5 timeout=30 - 再添加:
RewriteCond %{ENV:REDIRECT_HTTP_X_BACKEND_ERROR} =true(需先用Header echo X-Backend-Error暴露头) - 然后:
RewriteRule ^/api/.*$ /error/api-down.html [R=503,L] - 注意:这类规则需放在
ProxyPass之后,且RewriteEngine On必须启用











