微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Nginx:如何自定义错误页面取决于是否存在自定义 http 标头

如何解决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。

谢谢

解决方法

所以,在无数个小时之后,我发现这行不通。原因是,mapif 块在通过上游(代理)之前执行,因此映射和两者都没有当它们时没有 x-custom 内容被执行。

因此,我的解决方案是使用 Nginx OpenResty Lua 来检查我的自定义标头并决定显示哪个错误页面。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?