我有一个运行在端口 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,例如
ALB 重定向到
http://example.com:8080/about/
然后从不加载。我从未在 nginx 服务器上看到该请求的任何日志,这意味着它从未从 ALB 传递到目标组。请求在几分钟后超时。
似乎 ALB 可能正在尝试将请求转发到目标组,因为 8080 是运行 nginx 服务器的端口,但我不确定为什么请求永远不会到达。似乎尾部斜杠不会影响请求是否被转发,但我不确定。
我想也许我可以设置一个规则,将没有尾部斜杠的路由重定向到在 ALB 级别带有尾部斜杠的同一路由,但负载均衡器规则只有通配符,没有正则表达式。所以,这是一个死胡同。不过,我不确定这是否能解决问题,因为问题似乎出在 ALB 级别,而不是应用程序级别。
有人知道发生了什么吗?
答案 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
最好的, 斯蒂芬