Назад | Перейти на главную страницу

Как настроить nginx для перенаправления на https для определенного хоста за балансировщиком нагрузки завершения SSL

Здравствуйте, у меня есть веб-сервер (с запущенным 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 ;
 ....
}

Один из вариантов - установить серверный блок по умолчанию.

Nginx Doc server_name

Второй вариант - использовать циклы 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;
}

Лично я предпочитаю первый подход, потому что он мне чище.