如何设置 nginx,以便在 SSL 终止负载均衡器后面时将特定主机重定向到 https

如何设置 nginx,以便在 SSL 终止负载均衡器后面时将特定主机重定向到 https

您好,我在 EC2 中有一个 Web 服务器(运行 nginx),位于 ELB(负载均衡器)后面,它会终止 SSL 连接。

如果有对 www.domain.com 的请求,它将转到 http 到 ELB,然后传递到 nginx 服务器上的 http

如果有对 secure.domain.com 的请求,它应该转到 https 到 ELB,然后转到 http 到 nginx 服务器。

如果有请求进来,http://secure.domain.com我希望 nginx 执行 301 重定向到https://secure.domain.com

我可以通过使用 ELB 注入的 http_X_Forwarded_Proto 标头来实现这一点。因此,

server {
  listen       80;
  server_name  secure.domain.com ;

  if ($http_X_Forwarded_Proto = http) {
    return       301 https://secure.domain.com$request_uri;
  }

  ....
}

问题是“if()”似乎在服务器块上运行,因此对http://www.domain.com/foo(在不同的服务器块中)的请求被这个if()和301接收https://secure.domain.com/foo

如何配置 nginx 以将 secure.domains.com 重定向到 https 而不影响我所有其他 vhost?

谢谢

答案1

server {
   listen       80 default;
   server_name  domain.com ;
 ....
}

一个选项是拥有一个默认服务器块。

Nginx 文档 服务器名称

第二种选择是使用 if 循环来检查请求是否为 https 且主机是否为 secure.domain.com。

if ($host == secure.domain.com){
    set $random_var 1;
}
if ($http_X_Forwarded_Proto == https ){
    set $random_var 10;
}
if ($random_var == 10){
    return       301 https://secure.domain.com$request_uri;
}

我个人更喜欢第一种方法,因为我觉得它更干净。

相关内容