reescrever http para https com o ngnix por trás do balanceador de carga

10

Estou usando um balanceador de carga Rackspace que me permite configurar minha chave ssl / pem dentro do painel de administração. Tudo funciona bem, eu posso usar os protocolos http e https. Mas se eu tentar redirecionar http para https usando:

server{
  listen *:80;
  server_name mydomain.com www.mydomain.com; 
  rewrite ^ https://mydomain.com$request_uri? permanent;

... Eu recebo um loop de redirecionamento. Eu percebo que não estou ouvindo a porta 443, mas isso é porque o balanceador de carga lidou com isso para mim. Eu também tentei quebrar a reescrita em if ($scheme ~* http){ sem sucesso.

A outra parte da minha pergunta é que eu gostaria de remover o www da url, posso fazer isso com uma única reescrita? A reescrita acima não deveria cuidar disso também?

Obrigado pela sua ajuda!

    
por jwerre 26.04.2013 / 02:53

3 respostas

12

sciurus está correto em que os balanceadores de carga em nuvem da Rackspace configuram o protocolo X-Forwarded-Proto para https quando o SSL é descarregado no balanceador de carga. Para evitar um loop de redirecionamento no nginx, você deve poder adicionar o seguinte à seção location na configuração do vhost:

if ($http_x_forwarded_proto = "http") {
            rewrite  ^/(.*)$  https://mydomain.com/$1 permanent;
}

Isso deve evitar o loop de redirecionamento infinito ao redirecionar solicitações não https para https.

    
por 27.04.2013 / 03:43
15

Usando as variáveis de servidor incorporadas do nginx $request_uri e $server_name você pode fazer isso sem usar expressões regulares. Adicione o seguinte ao bloco location do seu servidor e pronto:

if ($http_x_forwarded_proto = "http") {
    return 301 https://$server_name$request_uri;
}

Isso pressupõe que seu balanceador de carga está enviando o cabeçalho $http_x_forwarded_proto junto com a solicitação para suas instâncias de back-end. Outros cabeçalhos comuns incluem $http_x_forwarded_scheme e também apenas $scheme .

Mais informações podem ser encontradas na documentação do nginx Pitfalls and Common Mistakes : link

    
por 04.04.2016 / 04:30
0

O balanceador de carga sempre fala com você por http. O que está acontecendo é

  1. O navegador faz uma solicitação para a porta 80 no balanceador de carga
  2. O balanceador de carga faz uma solicitação para a porta 80 em seu servidor da web
  3. Seu servidor da web envia um redirecionamento para o usuário
  4. O usuário faz uma solicitação para a porta 443 no balanceador de carga

Os passos 2-4 continuam repetindo até que o navegador detecte o loop de redirecionamento e desista.

EDIT: Para resolver isso, somente execute a reescrita quando o cabeçalho X-Forwarded-Proto estiver definido como http. Esse cabeçalho é como o balanceador de carga da Rackspace informa ao servidor da Web o protocolo pelo qual ele recebeu a solicitação.

    
por 26.04.2013 / 05:27