必须显式配置ErrorDocument指定502/503等状态码的本地URI路径,并用ProxyPass /errors/ !排除该路径以防二次代理,同时确保错误页返回原始状态码且资源使用根路径引用。

要在 Apache 中通过 mod_proxy 实现后端异常(如 502、503)时显示统一自定义页面,不能只开 ProxyErrorOverride On 就完事——它本身不提供页面,也不自动接管代理错误。关键在于三步协同:显式声明错误页路径、排除该路径被再次代理、确保状态码透传正确。
必须为每个目标状态码配 ErrorDocument
ProxyErrorOverride 只是“允许覆盖”,不是“自动覆盖”。后端挂掉返回的 502/503 属于 mod_proxy 模块生成的错误,Apache 默认不接管,除非你明确告诉它:“这个状态码,用这个本地页面来呈现”。
- 在
或全局配置中添加对应指令,例如:ErrorDocument 502 /errors/maint.htmlErrorDocument 503 /errors/maint.html - 路径必须以
/开头,指向网站根目录下可直接访问的 URI(如/errors/maint.html),不能是文件系统路径或外部 URL - 建议把所有错误页统一放在
/errors/目录下,便于管理与权限控制
用 ProxyPass ! 排除错误页路径,防止二次代理
如果你的主代理规则是 ProxyPass / http://backend/,而错误页又放在 /errors/ 下,Apache 默认会把对 /errors/maint.html 的请求也转发给后端——结果可能 404、空响应,甚至死循环。
- 必须在同配置段中,先写排除规则:
ProxyPass /errors/ ! - 这条指令要出现在
ProxyPass / http://backend/之前,否则无效 - 确保
/errors/下的 HTML、CSS、JS 都能由 Apache 直接服务,不要依赖后端提供静态资源
保持原始状态码,避免浏览器误判
自定义错误页返回时,HTTP 状态码必须仍是 502 或 503,否则浏览器可能忽略重定向逻辑、搜索引擎可能降权、前端监控可能漏报。
- Apache 默认维持原状态码,但若你用了 PHP 动态生成错误页(如
/errors/maint.php),必须手动设置:http_response_code(502); - 页面内引用资源(CSS/JS/图片)请用根路径,例如
/errors/style.css,避免相对路径因请求上下文变化导致加载失败 - 错误页 HTML 文件大小建议 ≥ 256 字节,防止某些旧浏览器(如 IE)强制显示默认错误页
配合健康检查实现更早兜底(可选增强)
如果希望在后端彻底不可达前就触发兜底,可结合 mod_proxy_hcheck 做前置探测,并用 mod_rewrite 在所有节点失效时跳转:
- 配置健康检查并标记故障节点:
BalancerMember http://10.0.1.10:8080 hcmethod=GET hcuri=/health hcinterval=5 hcfails=2 - 当均衡器中无可用成员时,用 Rewrite 规则转向静态页:
RewriteCond %{ENV:balancer_worker_route} ^$RewriteRule ^(.*)$ /errors/down.html [R=503,L] - 注意:该方式需启用
mod_rewrite和mod_proxy_balancer,且依赖balancer-manager状态暴露











