Como fazer com que o nginx encaminhe o cabeçalho HTTP_X_FORWARDED_PROTO?


18

Estou perseguindo minha configuração de

nginx > apache/php

para

haproxy > nginx > apache/php

(usando haproxy 1.5-dev18 com suporte a ssl compilado)

O nginx e o haproxy estão configurados corretamente para definir o cabeçalho HTTP_X_FORWARDED_PROTO. No entanto, quando o nginx obtém o tráfego SSL do haproxy, ele vê a conexão como http e define o cabeçalho como tal.

Como definir o nginx para encaminhar o cabeçalho HTTP_X_FORWARDED_PROTO, se ele existir, mas, caso contrário, continue definindo-o com base na conexão?

Respostas:


36

Eu descobri como resolver isso. O problema era que o nginx estava substituindo o cabeçalho definido pelo haproxy nesta linha da minha configuração:

proxy_set_header X-Forwarded-Proto $scheme;

Corrigi-o adicionando o seguinte:

map $http_x_forwarded_proto $thescheme {
     default $scheme;
     https https;
 }   

e alterando a linha proxy_set_header para usar o novo esquema:

proxy_set_header X-Forwarded-Proto $thescheme;

A menos que eu esteja perdendo alguma coisa, suas proxy_set_headerlinhas de antes e depois são as mesmas.
Wilfred Hughes

11
$schemevs $thescheme.
Arlen Beiler

Em alguns casos raros, isso não é inseguro? Se um navegador da web enviar uma solicitação HTTP para haproxy, e haproxy enviar uma solicitação HTTPS para o Nginx - o default $schemecaso ocorrerá, configurando $theschemepara HTTPS, embora, de fato, a solicitação (haproxy) seja HTTP inseguro. - Para evitar isso, que tal: default $http_x_forwarded_proto; '' $scheme;então, se o haproxy disser HTTP, será respeitado.
KajMagnus

Isso é sugerido aqui: stackoverflow.com/a/21911864/694469 (ou seja default $http_x_forwarded_proto;).
KajMagnus

2

Eu tive a mesma necessidade com o AWS ELB

Aqui está a minha linha de solução:

proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto;

Devo apostar em $http_x_forwarded_protoalgum lugar? O que é isso?
23418 Jonathan

developer.mozilla.org/pt-BR/docs/Web/HTTP/Headers/… $ http_x_forwarded_proto é a implementação do NGINX
jobwat

2
A sua resposta acabou de resolver um problema em que venho discutindo há 3 dias! Qualquer outro post sobre o assunto de aws balanceadores de carga com o https https proxy_set_header X-Forwarded-Proto $scheme;, que não funciona
MikeMarsian 23/01

1

Não posso apenas comentar, então eu posto isso como resposta: Você poderia nos fornecer parte ou toda a sua configuração nginx para que possamos ver o que há de errado com ela? Possivelmente sua configuração HAProxy também?

O primeiro problema em que consigo pensar é que o seu HAProxy está executando a terminação SSL. Para resumir, para descarregar seus servidores de back-end, um balanceador de carga pode ser configurado para fazer tudo o que é SSL e depois se comunicar com seus servidores de back-end em HTTP. Como o esquema aqui: http://blog.exceliance.fr/2012/09/10/how-to-get-ssl-with-haproxy-getting-rid-of-stunnel-stud-nginx-or-pound/

Para dar uma boa resposta à sua pergunta, verifique se você não tem nenhum problema de loopback na sua configuração http <> https? Talvez você possa redirecionar http para http, https para https e forçar o http a ser redirecionado para https.

Você também pode verificar se ativou a passagem SSL na sua configuração do HAProxy?


Você resolveu o seu problema?
Yannovitch

11
Eu descobri. Sua resposta não ajudou diretamente, mas esse segundo link me ajudou a descobrir uma maneira de resolvê-lo. Obrigado.
Echo diz Restabelecer Monica
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.