我使用 nginx 作为现有 Web 服务器上的反向代理。我只想管理一组自定义错误页面,最好在 nginx 中管理,因为这是最接近客户端的级别。
现在我可以使用error_pages
和proxy_intercept_errors
设置。但是:
如果出现 400(错误请求)错误,我需要底层 Web 服务器能够发送一些 JSON 正文内容,详细说明请求错误的原因。因此,我需要一种
proxy_intercept_errors
仅针对 400 状态代码禁用的方法。我绝不想要显示默认的 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