我正在使用 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 中的重定向循环,您应该能够将以下内容添加到location
vhost 配置中的部分:
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 与您通信。发生的事情是
- 浏览器向负载均衡器的 80 端口发出请求
- 负载均衡器向 Web 服务器上的 80 端口发出请求
- 您的 Web 服务器向用户发送重定向
- 用户向负载均衡器的 443 端口发出请求
步骤 2-4 不断重复,直到浏览器检测到重定向循环并放弃。
编辑:要解决此问题,请仅在 X-Forwarded-Proto 标头设置为 http 时执行重写。该标头是 Rackspace 的负载平衡器告诉您的 Web 服务器它通过哪种协议接收请求的方式。