AWS ALB 将 HTTPS 重定向到 HTTP 而没有尾部斜杠

时间:2021-07-21 15:08:10

标签: amazon-web-services nginx aws-application-load-balancer trailing-slash

我有一个运行在端口 8080 上的 nginx 服务器,它位于 AWS 应用程序负载均衡器后面。我在 nginx.conf

中有以下位置块
location / {
            limit_except GET { deny all; }
            root /root/of/project/;
            index index.html;
            try_files $uri $uri/ /index.html;
}

当我在本地运行服务器时,我能够点击 /some/path//some/path 并获得相同的响应,即尾部斜杠不不影响任何事情。当我部署应用程序时,我希望有相同的行为。

我在端口 80 上设置了带有 HTTP 侦听器的 AWS ALB,该侦听器将所有流量重定向到端口 443 上的 HTTPS 侦听器。HTTPS 侦听器只是转发到 nginx 服务器所在的目标组。这是我仅有的两条负载均衡器规则,仅此而已。

在我部署应用程序后,当我点击带有斜杠(例如 https://example.com/about/)的网址时,一切正常。它按预期加载。没有重定向或任何东西。我可以在 nginx 日志中看到请求通过。

但是,如果我点击了一个没有斜杠的 URL,例如

https://example.com/about

ALB 重定向到

http://example.com:8080/about/

然后从不加载。我从未在 nginx 服务器上看到该请求的任何日志,这意味着它从未从 ALB 传递到目标组。请求在几分钟后超时。

似乎 ALB 可能正在尝试将请求转发到目标组,因为 8080 是运行 nginx 服务器的端口,但我不确定为什么请求永远不会到达。似乎尾部斜杠不会影响请求是否被转发,但我不确定。

我想也许我可以设置一个规则,将没有尾部斜杠的路由重定向到在 ALB 级别带有尾部斜杠的同一路由,但负载均衡器规则只有通配符,没有正则表达式。所以,这是一个死胡同。不过,我不确定这是否能解决问题,因为问题似乎出在 ALB 级别,而不是应用程序级别。

有人知道发生了什么吗?

编辑:负载均衡器规则: http load balancer rule https load balancer rule

2 个答案:

答案 0 :(得分:1)

昨天遇到了这个问题,我在 443 上只有一个 ALB 侦听器,而 nginx 在 80 上打开,我想我用“absolute_redirect off”修复了它;在 nginx 配置中。我的完整配置文件:

server {
listen       80;
absolute_redirect off;

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ $uri/index.html =404;
}

error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /usr/share/nginx/html;
}
}

答案 1 :(得分:0)

更好的设置是在您的 ALB 上简单地执行 SSL 终止,然后使用转发规则创建 HTTP 侦听器,该转发规则将您的目标组作为目的地。这在简化证书管理、性能等方面具有多种好处。

在此处阅读有关 setting up HTTP listener

最好的, 斯蒂芬