尤里卡!!

尤里卡!!

我有两个用例:

  1. HTTPD 是 Tomcat 应用程序的代理

  2. HTTPD 是 PHP 应用程序的代理

出于合规性和安全性的考虑,所有 50x 错误在发送回客户端之前都必须重写为 503。暴露 50x 错误会泄露有关应用程序的信息,因此是一种不好的做法。

我仍然希望在 HTTPD 日志文件中看到 500,但必须重写发送回客户端的 HTTP 错误。

限制:

  1. 使用外部程序或其他应用程序是不可能的,例如 varnish、pound、nginx 等。

  2. 我不希望返回错误页面,我只需要重写 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]

资料来源:

奖励木偶积分:

$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,
  ...
}

相关内容