处理反向代理配置中的 nginx 错误

处理反向代理配置中的 nginx 错误

我使用 nginx 作为现有 Web 服务器上的反向代理。我只想管理一组自定义错误页面,最好在 nginx 中管理,因为这是最接近客户端的级别。

现在我可以使用error_pagesproxy_intercept_errors设置。但是:

  1. 如果出现 400(错误请求)错误,我需要底层 Web 服务器能够发送一些 JSON 正文内容,详细说明请求错误的原因。因此,我需要一种proxy_intercept_errors仅针对 400 状态代码禁用的方法。

  2. 绝不想要显示默认的 nginx 错误页面,例如任何状态代码。现在据我所知,为了实现这一点,我需要明确列出所有可能的状态代码,并为其设置一个错误页面?而不是仅仅使用通配符来表示 500 以上的所有错误。

我的问题是 - 上述 2 个问题是否可以在 nginx 本身内解决? 如果不能,是否有针对上述问题的明显解决方案?

答案1

我没有正确阅读文档。事实上,通过 400 错误绕过规则很简单,就像没有错误页面指令一样。

这是来自proxy_intercept_errors文档条目:

如果将其设置为 on,则 nginx 将拦截由 error_page 指令明确处理的状态代码。状态代码与 error_page 指令不匹配的响应将按原样从代理服务器发送。 (重点是我自己的)

答案2

如果您想要禁用proxy_intercept_errors某些/特定的 URL,请使用以下代码:

http {
      ...
  server {
       ...
       proxy_intercept_errors on;
      
       location ~ /MyApp/servlet/mydata/ {
           proxy_intercept_errors off;
       } 
     }
}

答案3

尝试以下操作。将此映射包含在您的 http 上下文中。

map $sent_http_status_code $400 {
  default 0;
  ~400    1;
}

在您的服务器上下文(当然是代理)中包含以下内容。

if ($400) {
  proxy_pass (socket|address:port);
}

关于你的第二个问题。你可以为更多错误指定单个文件,如下所示:

error_page 500 501 502 503 504 505 /500.html

维基百科列出了所有有效的 HTTP 状态代码并附有简短的解释:http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

相关内容