Здравствуйте, у меня есть веб-сервер (с запущенным nginx) в EC2 за ELB (балансировщиком нагрузки), который завершает SSL-соединения.
Если есть запрос к www.domain.com, он перейдет по http в ELB и будет передан по http на сервере nginx
Если есть запрос к secure.domain.com, он должен перейти по https на ELB и быть передан по http на сервер nginx.
Если приходит запрос http://secure.domain.com
Я бы хотел, чтобы nginx сделал 301 редирект на https://secure.domain.com
.
Я могу добиться этого, используя заголовок http_X_Forwarded_Proto, который вводится ELB. Так что-то вроде
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, не влияя на все мои другие хосты?
Спасибо
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;
}
Лично я предпочитаю первый подход, потому что он мне чище.