要让apache代理提供统一出错页,需三步:一、用errordocument为各错误码指定根路径下的真实页面;二、用proxypass /errors/ !等排除规则防止错误页被二次代理;三、动态页须手动设http_response_code()并禁用跳转,资源引用一律用根路径。

要让 Apache 代理为后端服务提供统一的出错页,关键不是只打开一个开关,而是把三件事做对:明确告诉 Apache 哪些错误用哪个页面、确保这些页面不被再次转发给后端、保证浏览器收到的仍是原始错误状态码。
必须显式配置每个错误码对应的页面
ProxyErrorOverride On 只是“允许替换”的开关,它本身不指定任何页面。你得为想接管的每个状态码单独写 ErrorDocument:
- ErrorDocument 502 /errors/gateway-down.html
- ErrorDocument 503 /errors/service-unavailable.html
- ErrorDocument 504 /errors/timeout.html
路径必须以 / 开头,指向网站根目录下真实存在的文件(如 /var/www/html/errors/503.html),不能是本地文件路径或外部网址。
排除错误页路径,防止二次代理
如果你配置了 ProxyPass / http://backend/,而错误页放在 /errors/ 下,Apache 默认会把对 /errors/503.html 的请求也转发给后端——结果常是 404 或无限循环。
解决方法是在同一配置段中,在 ProxyPass 规则之前 加上排除项:
- ProxyPass /errors/ !
- ProxyPass /css/ !
- ProxyPass /js/ !
这样 /errors/ 下的所有资源(HTML、CSS、JS)都由 Apache 直接响应,不走代理。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
保持原始 HTTP 状态码不被覆盖
浏览器是否显示你的自定义页,取决于响应头里的状态码是否匹配。静态 HTML 页面 Apache 默认保留原始 502/503 码,无需额外操作。
但如果你用 PHP 动态生成错误页(比如 /errors/503.php),PHP 默认会把状态码设为 200,导致接管失效。必须在脚本开头手动设置:
同时,避免在错误页里做 header("Location: ...") 跳转,否则状态码变成 302,整个逻辑就断了。
页面资源引用要用根路径
错误页里的 CSS、图片、JS 都要使用以 / 开头的路径,比如:
别用相对路径(如 ./style.css 或 ../css/style.css),因为请求上下文可能变化,容易加载失败,导致页面样式错乱。











