您好我在EC2(负载均衡器)后面的EC2中有一个Web服务器(运行Nginx),它终止了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()”似乎在服务器块上运行,因此对这个if()和http://www.domain.com/foo(在不同的服务器块中)的请求被拾取301到https://secure.domain.com/foo.
如何配置Nginx只是将secure.domains.com重定向到https而不影响我的所有其他虚拟主机?
谢谢
最佳答案
server {
listen 80 default;
server_name domain.com ;
....
}
一种选择是拥有默认服务器块.
第二个选项是使用if循环来检查请求是https且host是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;
}
我个人更喜欢第一种方法,因为我发现它更清洁.