¿Cómo hacer que nginx reenvíe el encabezado HTTP_X_FORWARDED_PROTO?

18

Estoy persiguiendo mi configuración de

nginx > apache/php

a

haproxy > nginx > apache/php

(utilizando haproxy 1.5-dev18 con soporte ssl compilado)

Tanto nginx como haproxy están configurados correctamente para establecer el encabezado HTTP_X_FORWARDED_PROTO. Sin embargo, cuando nginx obtiene el tráfico ssl de haproxy, ve la conexión como http y establece el encabezado como tal.

¿Cómo puedo configurar nginx para reenviar el encabezado HTTP_X_FORWARDED_PROTO si existe, pero de lo contrario continuar configurándolo en función de la conexión?

Echo dice reinstalar a Mónica
fuente

Respuestas:

36

Descubrí cómo resolver esto. El problema era que nginx estaba sobrescribiendo el encabezado establecido por haproxy en esta línea de mi configuración:

proxy_set_header X-Forwarded-Proto $scheme;

Lo arreglé agregando esto:

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

y cambiando la línea proxy_set_header para usar el nuevo esquema:

proxy_set_header X-Forwarded-Proto $thescheme;
Echo dice reinstalar a Mónica
fuente
A menos que me falte algo, sus proxy_set_headerlíneas de antes y después son las mismas.
Wilfred Hughes
1
$schemevs $thescheme.
Arlen Beiler
¿No es esto en algunos casos raros inseguro? Si un navegador web envía una solicitud HTTP a haproxy, y haproxy luego envía una solicitud HTTPS a Nginx, entonces el default $schemecaso sucederá, configurando $theschemeHTTPS aunque, de hecho, la solicitud (a haproxy) es HTTP inseguro. - Para evitar eso, ¿qué pasa con: default $http_x_forwarded_proto; '' $scheme;así que si haproxy dice HTTP se respetará?
KajMagnus
Aquí se sugiere: stackoverflow.com/a/21911864/694469 (es decir default $http_x_forwarded_proto;).
KajMagnus
2

Tenía la misma necesidad con AWS ELB

Aquí está mi línea de resolución:

proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto;
Jobwat
fuente
¿Debería apostar en $http_x_forwarded_protoalgún lugar? ¿Que es eso?
Jonathan
developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… $ http_x_forwards_proto es la implementación de
NGINX
2
¡Su respuesta acaba de resolver un problema en el que he estado trabajando durante 3 días! Cualquier otra publicación sobre el tema de balanceadores de carga AWS con https advocate proxy_set_header X-Forwarded-Proto $scheme;, que no funciona
MikeMarsian
1

No puedo comentar, así que publico esto como respuesta: ¿Podría darnos una parte o la totalidad de su configuración nginx para que podamos ver qué tiene de malo? ¿Posiblemente su configuración HAProxy también?

El primer problema que se me ocurre es que su HAProxy está haciendo la terminación de SSL. Para resumir, para descargar sus servidores de back-end, se puede configurar un equilibrador de carga para hacer todo lo de SSL y luego comunicarse con sus servidores de back-end en HTTP. Como el esquema aquí: http://blog.exceliance.fr/2012/09/10/how-to-get-ssl-with-haproxy-getting-rid-of-stunnel-stud-nginx-or-pound/

Para darle una buena respuesta a su pregunta, ¿podría verificar que no tiene ningún problema de bucle invertido en su configuración http <> https? Tal vez entonces podría redirigir http a http, https a https, y luego forzar que http se redirija a https.

¿Podría verificar también que ha habilitado el paso ssl en su configuración de HAProxy?

Yannovich
fuente
¿Resolviste tu problema?
Yannovitch
1
Me lo imaginé. Su respuesta no ayudó directamente, pero ese segundo enlace me ayudó a encontrar una manera de resolverlo. Gracias.
Echo dice Reinstate Monica