【问题标题】:AWS ALB Redirects HTTPS to HTTP without trailing slashAWS ALB 将 HTTPS 重定向到 HTTP 而不使用尾部斜杠
【发布时间】:2021-07-24 03:50:46
【问题描述】:

我有一个运行在端口 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 服务器所在的目标组。这是我仅有的两个负载均衡器规则,没有别的了。

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

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

https://example.com/about

ALB 重定向到

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

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

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

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

有人知道发生了什么吗?

编辑:负载均衡器规则:

【问题讨论】:

  • 这个设置对我来说毫无意义。您应该在 ALB 进行 SSL 终止。你能显示你的重定向规则吗?
  • 图像现在包含在负载均衡器规则中。什么是更好的设置?
  • 截图中的规则与你描述的行为相反,所以我看不出它怎么可能是负载均衡器。听起来您可能在 Nginx 或 Nginx 的代理目标中发生了某种重定向。
  • 流量 -> HTTP 监听器 -> 重定向到 -> HTTPS 监听器 -> 转发到 -> 目标组。在它到达目标组之前,它会被负载均衡器解密。那是我部署证书的地方。目标组接收正常的 HTTP 流量。该设置有什么不正确的?我的误会在哪里?

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


【解决方案1】:

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

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;
}
}

【讨论】:

  • 迟到的回复,但经过多次拉扯和尖叫后,我终于试了一下。像魅力一样工作。谢谢!
【解决方案2】:

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

在这里阅读setting up HTTP listener

最好, 斯蒂芬

【讨论】:

  • 我很困惑。证书存在于负载平衡器级别,而不是服务器上。我认为 HTTPS 侦听器在将请求转发到目标组之前自动解密了请求?这不是在目标组中指定 ip 和协议的重点吗?你是在告诉我负载均衡器将 HTTPS 转发到服务器而不解密它吗?因为这没有意义,因为当 URL 中包含尾部斜杠时,当前设置可以正常工作。
  • 是的,这是正确的:“证书存在于负载均衡器级别,而不是服务器上。” HTTPS 侦听器也将终止 SSL(解密请求)。我建议像这样设置它并在您的 HTTPS 侦听器中使用转发规则而不是重定向规则。
  • 我在 HTTPS 侦听器上没有重定向规则。我有一个转发规则,将流量路由到 nginx 服务器所在的目标组。
  • 对不起,我看错了你的问题。 ALB 设置对我来说看起来不错。它认为问题不在于 ALB 方面,而在于目标组实例。
  • 目标组配置还是实例本身的nginx配置?
猜你喜欢
  • 2021-05-21
  • 2017-10-10
  • 2016-08-13
  • 2014-08-10
  • 2018-07-17
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
相关资源
最近更新 更多