您好,我在 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 ;
....
}
一个选项是拥有一个默认服务器块。
第二种选择是使用 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;
}
我个人更喜欢第一种方法,因为我觉得它更干净。