我有两个用例:
HTTPD 是 Tomcat 应用程序的代理
HTTPD 是 PHP 应用程序的代理
出于合规性和安全性的考虑,所有 50x 错误在发送回客户端之前都必须重写为 503。暴露 50x 错误会泄露有关应用程序的信息,因此是一种不好的做法。
我仍然希望在 HTTPD 日志文件中看到 500,但必须重写发送回客户端的 HTTP 错误。
限制:
使用外部程序或其他应用程序是不可能的,例如 varnish、pound、nginx 等。
我不希望返回错误页面,我只需要重写 HTTP 状态。即将以下
HTTP/1.1 500
内容更改为:503
[user@host]$ curl -I http://localhost:8080/500.php HTTP/1.1 500 Internal Server Error <OUTPUT OMITTED>
这可能吗?
注意:我使用以下代码创建了错误页面:
for http_status in 401 403 500 501 503; do
echo -e "<?php\nhttp_response_code(${http_status});" > ${http_status}.php
done
答案1
尤里卡!!
在拼凑了其他几个*exchange 帖子之后,我找到了一个可行的解决方案;为后端 500 指定一个错误文档,然后对对该文档的所有调用返回 503。
此代码块可以位于VirtualHost
定义中:
ProxyErrorOverride on
ErrorDocument 500 /500.html
RewriteEngine on
RewriteCond %{REQUEST_URI} /500.html
RewriteRule .* - [R=503]
资料来源:
- https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxyerroroverride
- https://httpd.apache.org/docs/2.4/mod/core.html#errordocument
- https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewritecond
- https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriterule
奖励木偶积分:
$rewrites = [
{
comment => ' Rewrite 503.html',
rewrite_cond => ['%{REQUEST_URI} /503.html'],
rewrite_rule => ['.* - [R=503]']
}
]
$error_documents => [
{ 'error_code' => '500', 'document' => '/503.html' },
{ 'error_code' => '501', 'document' => '/503.html' },
{ 'error_code' => '502', 'document' => '/503.html' },
# Creating an error document for 503 creates an infinite redirect loop
{ 'error_code' => '504', 'document' => '/503.html' },
{ 'error_code' => '505', 'document' => '/503.html' },
{ 'error_code' => '506', 'document' => '/503.html' },
{ 'error_code' => '507', 'document' => '/503.html' },
{ 'error_code' => '508', 'document' => '/503.html' },
# There is no 509: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#5xx_Server_errors
{ 'error_code' => '510', 'document' => '/503.html' },
{ 'error_code' => '511', 'document' => '/503.html' },
]
apache::vhost { $name:
...
error_documents => $error_documents,
proxy_error_override => true,
proxy_pass => [],
rewrites => $rewrites,
...
}