apache mod_proxy 不直接重定向错误页,而是通过 proxyerroroverride 开关配合 errordocument 显式映射(如 errordocument 502 /errors/50x.html)、proxypass /errors/ ! 排除路径、静态页自动保持状态码或 php 页手动调用 http_response_code(),统一接管 502/503/504 等代理层错误。
apache mod_proxy 本身不直接做“错误页面重定向”,而是通过组合 proxyerroroverride、errordocument 和 proxypass ! 实现对后端异常(如 502/503/504)的接管与自定义响应。关键不是跳转,而是用本地页面替换原始错误响应,并保持正确状态码。
启用 ProxyErrorOverride 并配 ErrorDocument
ProxyErrorOverride 是开关,不是功能主体。它只允许你用本地页面覆盖代理层错误,但必须显式声明每个状态码对应哪个页面:
- 在 VirtualHost 中添加:
ProxyErrorOverride On - 紧接着配置具体映射,例如:
ErrorDocument 502 /errors/50x.htmlErrorDocument 503 /errors/50x.htmlErrorDocument 504 /errors/50x.html - 路径必须以
/开头,是 Apache 能直接服务的 URI(如/errors/50x.html),对应文件需真实存在于 DocumentRoot 下(如/var/www/html/errors/50x.html)
排除错误页路径,防止被再次代理
如果错误页路径(如 /errors/)没被排除,而主代理规则是 ProxyPass / http://backend/,Apache 会把请求又转发给后端,导致 404 或循环失败:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 在
ProxyPass规则之后、立即添加排除指令:ProxyPass /errors/ ! - 同样排除静态资源路径:
ProxyPass /static/ !、ProxyPass /css/ !等 - 确保这些路径下文件可被 Apache 直接读取,不经过后端
区分后端返回错误和代理自身错误
这是最容易混淆的一点:
-
ProxyErrorOverride只接管 Apache 自己生成的 502/503/504(比如连不上、超时、网关不可用) - 后端主动返回的 401、429、503(业务级)等,默认透传,
ProxyErrorOverride对它们无效 - 要统一处理后端返回的错误码,得靠其他方式:让后端重定向到预设路径(配合
ErrorDocument),或用mod_rewrite检测响应头(如X-Handled-Error: 429)再触发对应页面
动态错误页需手动维持状态码
静态 HTML 页面默认继承原始错误状态码(如访问 /errors/502.html 时响应仍是 502),但 PHP 等动态页默认返回 200:
- PHP 错误页开头必须加:
<?php http_response_code(502); ?> - 避免在错误页里做
header("Location: ..."),否则状态码变成 302,前端无法识别原始错误语义 - 不建议在错误页中嵌入 JS 渲染逻辑,维护页应尽量纯静态










