如何解决Nginx:如何自定义错误页面取决于是否存在自定义 http 标头
我们在 tomcat 之前使用 Nginx 作为反向 http 代理。我们的应用程序可以根据请求返回不同的 HTTP 状态代码(400、401、404、403)。来自我们应用的每个响应都返回自定义 HTTP 标头,假设 X-Custom 用于确定应用是否正在运行并为请求提供服务。
我们在 Nginx 方面的目标是在存在自定义 HTTP 标头 X-Custom 的情况下向客户端提供由我们的应用程序生成的自定义错误页面,否则(如果不存在 X-Custom)从 Nginx 提供我们的自定义静态页面.
问题是,即使我尝试了几乎所有方法,我也无法找到可行的解决方案。我确定我遗漏了一些明显的东西。
Nginx 配置如下:
location / {
proxy_set_header X-Forwarded-Port 80;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_intercept_errors on;
proxy_pass http://172.16.0.32:8080;
if ($is_x_custom_not_ok = "No") {
error_page 400 401 404 403 500 502 503 /503.html;
}
}
map $upstream_http_x_custom $is_x_custom_not_ok {
default "No";
~. "Yes";
}
location /503.html {
root /var/www/;
internal;
}
这导致即使存在标头 X-Custom 并且应用返回 HTTP 400,也会显示静态 503.html。仅当响应中不存在 X-Custom 时才应加载 503.html。
谢谢
解决方法
所以,在无数个小时之后,我发现这行不通。原因是,map
和 if
块在通过上游(代理)之前执行,因此映射和两者都没有当它们时没有 x-custom 内容被执行。
因此,我的解决方案是使用 Nginx OpenResty Lua 来检查我的自定义标头并决定显示哪个错误页面。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。