AWS ALB 将 HTTPS 重定向到没有尾部斜杠的 HTTP
AWS ALB Redirects HTTPS to HTTP without trailing slash
我在 AWS Application Load Balancer 后面的端口 8080 上有一个 nginx 服务器 运行ning。我在 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 而没有尾部斜杠,例如
ALB 重定向到
http://example.com:8080/about/
然后永远不会加载。我从未在 nginx 服务器上看到该请求的任何日志,这意味着它从未从 ALB 传递到目标组。请求在几分钟后超时。
似乎 ALB 可能试图将请求转发给目标组,因为 8080 是 nginx 服务器 运行 所在的端口,但我不确定为什么请求永远不会到达。尾部斜杠似乎不会影响请求是否被转发,但我不确定。
我想也许我可以设置一个规则,在 ALB 级别将没有尾部斜线的路由重定向到带有尾部斜线的同一路由,但负载均衡器规则只有通配符,没有正则表达式。所以,这是一个死胡同。不过,我不确定这是否能解决问题,因为问题似乎出在 ALB 级别,而不是应用程序级别。
有谁知道发生了什么事吗?
编辑:负载平衡器规则:
更好的设置是简单地在您的 ALB 上执行 SSL 终止,然后创建一个带有转发规则的 HTTP 侦听器,该转发规则将您的目标组作为目的地。这在简化证书管理、性能等方面有很多好处。
在此处阅读有关 setting up HTTP listener
的信息
最好,
斯特凡
昨天遇到这个问题,我在 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;
}
}
我在 AWS Application Load Balancer 后面的端口 8080 上有一个 nginx 服务器 运行ning。我在 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 而没有尾部斜杠,例如
ALB 重定向到
http://example.com:8080/about/
然后永远不会加载。我从未在 nginx 服务器上看到该请求的任何日志,这意味着它从未从 ALB 传递到目标组。请求在几分钟后超时。
似乎 ALB 可能试图将请求转发给目标组,因为 8080 是 nginx 服务器 运行 所在的端口,但我不确定为什么请求永远不会到达。尾部斜杠似乎不会影响请求是否被转发,但我不确定。
我想也许我可以设置一个规则,在 ALB 级别将没有尾部斜线的路由重定向到带有尾部斜线的同一路由,但负载均衡器规则只有通配符,没有正则表达式。所以,这是一个死胡同。不过,我不确定这是否能解决问题,因为问题似乎出在 ALB 级别,而不是应用程序级别。
有谁知道发生了什么事吗?
编辑:负载平衡器规则:
更好的设置是简单地在您的 ALB 上执行 SSL 终止,然后创建一个带有转发规则的 HTTP 侦听器,该转发规则将您的目标组作为目的地。这在简化证书管理、性能等方面有很多好处。
在此处阅读有关 setting up HTTP listener
的信息最好, 斯特凡
昨天遇到这个问题,我在 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;
}
}