Come fare in modo che nginx inoltri l'intestazione HTTP_X_FORWARDED_PROTO?


18

Sto inseguendo il mio setup da

nginx > apache/php

per

haproxy > nginx > apache/php

(usando haproxy 1.5-dev18 con supporto ssl compilato in)

Sia nginx che haproxy sono impostati correttamente per impostare l'intestazione HTTP_X_FORWARDED_PROTO. Tuttavia, quando nginx ottiene il traffico ssl da haproxy, vede la connessione come http e imposta l'intestazione in questo modo.

Come posso impostare nginx per inoltrare l'intestazione HTTP_X_FORWARDED_PROTO se esiste, ma altrimenti continuare a impostarla in base alla connessione?

Risposte:


36

Ho capito come risolverlo. Il problema era che nginx stava sovrascrivendo l'intestazione impostata da haproxy su questa riga della mia configurazione:

proxy_set_header X-Forwarded-Proto $scheme;

Ho risolto aggiungendo questo:

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

e cambiando la riga proxy_set_header per usare il nuovo schema:

proxy_set_header X-Forwarded-Proto $thescheme;

A meno che non mi manchi qualcosa, le tue proxy_set_headerrighe prima e dopo sono le stesse.
Wilfred Hughes,

1
$schemevs $thescheme.
Arlen Beiler,

In alcuni rari casi questo non è insicuro? Se un browser Web invia una richiesta HTTP a haproxy e haproxy quindi invia una richiesta HTTPS a Nginx - il default $schemecaso accadrà, impostando $theschemesu HTTPS sebbene in realtà la richiesta (a haproxy) sia HTTP non sicura. - Per evitarlo, che dire di default $http_x_forwarded_proto; '' $scheme;:, quindi se haproxy dice HTTP sarà rispettato.
KajMagnus

Questo è suggerito qui: stackoverflow.com/a/21911864/694469 (ie default $http_x_forwarded_proto;).
KajMagnus

2

Ho avuto lo stesso bisogno con AWS ELB

Ecco la mia linea di risoluzione:

proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto;

Devo scommettere sull'impostazione $http_x_forwarded_proto da qualche parte? Cos'è quello?
Jonathan,

developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… $ http_x_forwarded_proto è l'implementazione di
NGINX

2
Mi rispondi, ho appena risolto un problema a cui ho martellato per 3 giorni! Ogni altro post in materia di bilanciatori del carico aws con avvocato httpsproxy_set_header X-Forwarded-Proto $scheme; , che non funziona
MikeMarsian,

1

Non posso limitarmi a commentare, quindi inserisco questo come risposta: potresti darci una parte o tutta la tua configurazione nginx in modo che possiamo vedere cosa c'è che non va? Forse anche la tua configurazione HAProxy?

Il primo problema che mi viene in mente è che il tuo HAProxy sta terminando ssl. Per riassumere, per scaricare i server back-end, è possibile configurare un bilanciamento del carico per eseguire tutte le operazioni SSL e quindi comunicare con i server back-end in HTTP. Come lo schema qui: http://blog.exceliance.fr/2012/09/10/how-to-get-ssl-with-haproxy-getting-rid-of-stunnel-stud-nginx-or-pound/

Per darti una buona risposta alla tua domanda, potresti controllare di non avere problemi di loopback nella tua configurazione http <> https? Forse allora potresti reindirizzare http su http, https su https e quindi forzare il reindirizzamento di http su https.

Potresti verificare anche di aver abilitato passthrough ssl nella tua configurazione HAProxy?


Hai risolto il tuo problema?
Yannovitch,

1
L'avevo capito. La tua risposta non ha aiutato direttamente, ma quel secondo link mi ha aiutato a trovare un modo per risolverlo. Grazie.
Echo dice che ripristina Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.