Como configurar o nginx para redirecionar para https para determinado host quando estiver atrás de um balanceador de carga de terminação SSL

4

Olá, eu tenho um servidor da web (executando nginx) no EC2 atrás de um ELB (balanceador de carga) que finaliza as conexões SSL.

Se houver uma solicitação para www.domain.com, ele irá para o ELB e será passado para http no servidor nginx

Se houver uma solicitação para secure.domain.com, ele deverá ir para https no ELB e ser passado para http no servidor nginx.

Se uma solicitação chegar em http://secure.domain.com , eu gostaria que o nginx fizesse um redirecionamento 301 para https://secure.domain.com .

Eu posso fazer isso usando o cabeçalho http_X_Forwarded_Proto que é injetado pelo ELB. Então, algo parecido com

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

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

  ....
}

O problema é que o "if ()" parece ser executado nos blocos do servidor, portanto, uma solicitação para http://www.domain.com/foo (em um bloco de servidor diferente) é capturada por if () e 301 para https://secure.domain.com/foo .

Como posso configurar o nginx para redirecionar o secure.domains.com para o https sem afetar todos os meus outros vhosts?

Obrigado

    
por mp3tricord 23.12.2012 / 21:51

1 resposta

2

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

Uma opção é ter um bloco de servidor padrão.

Doc Nginx server_name

A segunda opção é ter if loops para verificar a condição de que a solicitação é https e o 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;
}

Eu pessoalmente prefiro a primeira abordagem porque a acho mais limpa.

    
por 26.12.2012 / 15:20