Apache mod_proxy_balancer不提供错误页重定向,需ProxyErrorOverride+ErrorDocument+ProxyPass排除路径协同实现:显式配置502/503/504错误页、排除/errors/等路径防代理循环、利用503信号跳转维护页并保持状态码。
apache mod_proxy_balancer 本身不直接提供错误页面重定向功能,它只负责调度请求和管理后端节点状态。要实现“后端全部不可用时显示自定义提示页”,必须靠 proxyerroroverride + errordocument + proxypass 排除路径 三者协同,再结合负载均衡器的故障信号(如无健康节点)触发跳转。
明确错误接管范围:只处理网关类错误
502、503、504 是代理层最典型的后端异常,用户不该看到原始 Apache 错误页。需显式声明接管:
- 在虚拟主机或主配置中启用开关:ProxyErrorOverride On 502 503 504(Apache 2.4.47+ 支持按状态码精确控制)
- 为每个状态码配本地页面:ErrorDocument 502 /errors/gateway-down.html
ErrorDocument 503 /errors/service-unavailable.html
ErrorDocument 504 /errors/timeout.html - 所有路径必须以 / 开头,且文件真实存在于 DocumentRoot 下(如 /var/www/html/errors/)
防止错误页被再次代理:关键要排除路径
如果错误页路径(如 /errors/)没被排除,而你又写了 ProxyPass / http://backend/,Apache 会把请求转发给后端——导致 404 或无限循环。
- 在所有 ProxyPass 规则之后,立即添加排除规则:ProxyPass /errors/ !
- 同样排除静态资源路径:ProxyPass /static/ !、ProxyPass /css/ !、ProxyPass /js/ !
- 确保这些目录下的 HTML、CSS、JS 文件都放在 DocumentRoot 对应位置,不依赖后端服务
兜底跳转:当所有后端节点失效时转向维护页
mod_proxy_balancer 在检测到集群中无可用节点时,会返回 503 状态。可利用这个信号做最终跳转:
- 启用 mod_rewrite,并添加条件判断:RewriteCond %{ENV:balancer_worker_route} ^$
- 匹配后跳转到纯静态维护页:RewriteRule ^(.*)$ /maintenance.html [R=503,L]
- 更轻量的做法是复用 ErrorDocument:ErrorDocument 503 /maintenance.html,并确保 /maintenance.html 已被 ProxyPass /maintenance.html ! 排除
动态页注意状态码保持
若错误页由 PHP 生成,默认响应头可能变成 200 OK,浏览器就无法识别为错误页,导致接管失效。
- PHP 页面开头必须手动设回原状态码:
- 避免在错误页中使用 header("Location: ..."),否则状态码变为 302,逻辑中断
- 静态 HTML 页面无此问题,Apache 默认继承原始 502/503 状态码










