我正在使用 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,我可以通过一次重写来做到这一点吗?上面的重写不应该也解决这个问题吗?
谢谢你的帮助!
通过使用 nginx 的内置服务器变量
$request_uri
,$server_name
您可以在根本不使用正则表达式的情况下完成此操作。将以下内容添加到服务器的location
块中,您就完成了:这假设您的负载均衡器将
$http_x_forwarded_proto
标头连同请求一起发送到您的后端实例。其他常见标头$http_x_forwarded_scheme
包括$scheme
.更多信息可以在 nginx陷阱和常见错误文档中找到:https ://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites
sciurus 是正确的,因为当 SSL 在负载均衡器上卸载时,Rackspace 的云负载均衡器将 X-Forwarded-Proto 设置为 https。为了避免 nginx 中的重定向循环,您应该能够将以下内容添加到
location
vhost 配置中的部分:这应该避免在将非 https 请求重定向到 https 时出现无限重定向循环。
负载均衡器总是通过 http 与您交谈。发生的事情是
步骤 2-4 不断重复,直到浏览器检测到重定向循环并放弃。
编辑:要解决此问题,请仅在 X-Forwarded-Proto 标头设置为 http 时执行重写。该标头是 Rackspace 的负载平衡器如何告诉您的 Web 服务器它接收请求所使用的协议。