Nginx: Detectar conexão HTTPS usando um cabeçalho

5

No meu balanceador de carga, termino as conexões HTTPS com Nginx e, em seguida, proxy a solicitação para um dos servidores da Web que também são suportados pelo Nginx.

No balanceador de carga do fastcgi_params eu tenho:

fastcgi_param   HTTPS   $https;

Nos servidores da web, há um site que só pode ser acessado por HTTPS. Como posso detectar se o parâmetro HTTPS está definido e se não redirecionar para a versão segura do site?

    
por Jason Christa 01.08.2013 / 00:00

1 resposta

16

Se eu entendi corretamente, sua configuração é algo assim:

client -(http/https)-> nginx(front) -(http)-> nginx(back) -(fastcgi)-> app

Na verdade, existem três locais diferentes onde o redirecionamento pode ser feito:

No seu servidor Nginx frontal, você pode apenas redirecionar quando necessário:

if ( $https != 'on' ) {
  return 301 https://$host$request_uri;
}

Se você não puder fazer isso no servidor Nginx da frente, terá que carregar informações sobre o protocolo usado para retornar a instância do Nginx. O modo usual é o uso do cabeçalho X-Forwarded-Proto. Você deve adicionar em local apropriado no seu servidor Nginx:

proxy_set_header X-Forwarded-Proto $scheme;

Em seguida, você pode fazer o redirecionamento no servidor Nginx:

if ( $http_x_forwarded_proto != 'https' ) {
  return 301 https://$host$request_uri;
}

Obviamente, você também pode gerenciar o redirecionamento dentro do aplicativo. Você deve ter o cabeçalho X-Forwarded-Proto disponível no aplicativo, ou você pode configurá-lo como fastcgi param:

Em algum lugar no http {}

map $http_x_forwarded_proto $fe_https {
  default off;
  https on;
}

E mapeamento extra:

fastcgi_param   HTTPS $fe_https;

Pessoalmente, acho que o redirecionamento deve ser feito no início de uma cadeia como plausível.

    
por 01.08.2013 / 01:33

Tags