使用负载均衡器后面的 ngnix 将 http 重写为 https

使用负载均衡器后面的 ngnix 将 http 重写为 https

我正在使用 Rackspace 负载均衡器,它使我能够在管理面板内设置 SSL 密钥/pem。一切正常,我可以使用 http 和 https 协议。但是,如果我尝试使用以下命令将 http 重定向到 https:

server{
  listen *:80;
  server_name mydomain.com www.mydomain.com; 
  rewrite ^ https://mydomain.com$request_uri? permanent;

...我遇到了重定向循环。我意识到我没有监听端口 443,但这是因为负载均衡器帮我处理了这个问题。我还尝试过将重写打包进去,if ($scheme ~* http){但无济于事。

我的问题的另一部分是我想从 URL 中删除 www,我可以通过一次重写来实现吗?上面的重写不应该也能解决这个问题吗?

感谢您的帮助!

答案1

sciurus 的说法是正确的,当 SSL 在负载均衡器上卸载时,Rackspace 的云负载均衡器会将 X-Forwarded-Proto 设置为 https。为了避免 nginx 中的重定向循环,您应该能够将以下内容添加到locationvhost 配置中的部分:

if ($http_x_forwarded_proto = "http") {
            rewrite  ^/(.*)$  https://mydomain.com/$1 permanent;
}

这应该可以避免将非 https 请求重定向到 https 时出现无限重定向循环。

答案2

通过使用 nginx 的内置服务器变量$request_uri$server_name您可以完全不使用正则表达式来执行此操作。将以下内容添加到您的服务器location块中即可完成:

if ($http_x_forwarded_proto = "http") {
    return 301 https://$server_name$request_uri;
}

$http_x_forwarded_proto这假设您的负载均衡器将标头与请求一起发送到您的后端实例。其他常见标头包括$http_x_forwarded_scheme$scheme

更多信息可以参阅 nginx陷阱和常见错误文档:https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites

答案3

负载均衡器始终通过 http 与您通信。发生的事情是

  1. 浏览器向负载均衡器的 80 端口发出请求
  2. 负载均衡器向 Web 服务器上的 80 端口发出请求
  3. 您的 Web 服务器向用户发送重定向
  4. 用户向负载均衡器的 443 端口发出请求

步骤 2-4 不断重复,直到浏览器检测到重定向循环并放弃。

编辑:要解决此问题,请仅在 X-Forwarded-Proto 标头设置为 http 时执行重写。该标头是 Rackspace 的负载平衡器告诉您的 Web 服务器它通过哪种协议接收请求的方式。

相关内容