Comment faire pour que nginx transfère l'en-tête HTTP_X_FORWARDED_PROTO?

18

Je chaine ma configuration depuis

nginx > apache/php

à

haproxy > nginx > apache/php

(en utilisant haproxy 1.5-dev18 avec le support SSL compilé en)

Nginx et haproxy sont correctement configurés pour définir l'en-tête HTTP_X_FORWARDED_PROTO. Cependant, lorsque nginx obtient le trafic ssl de haproxy, il voit la connexion comme http et définit l'en-tête comme tel.

Comment puis-je configurer nginx pour transférer l'en-tête HTTP_X_FORWARDED_PROTO s'il existe, mais sinon continuer à le définir en fonction de la connexion?

Echo dit de réintégrer Monica
la source

Réponses:

36

J'ai compris comment résoudre ce problème. Le problème était que nginx écrasait l'en-tête défini par haproxy sur cette ligne de ma configuration:

proxy_set_header X-Forwarded-Proto $scheme;

Je l'ai corrigé en ajoutant ceci:

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

et changer la ligne proxy_set_header pour utiliser le nouveau schéma:

proxy_set_header X-Forwarded-Proto $thescheme;
Echo dit de réintégrer Monica
la source
À moins que je manque quelque chose, vos proxy_set_headerlignes avant et après sont les mêmes.
Wilfred Hughes
1
$schemevs $thescheme.
Arlen Beiler
N'est-ce pas dans de rares cas précaires? Si un navigateur Web envoie une demande HTTP à haproxy, et haproxy envoie ensuite une demande HTTPS à Nginx - alors le default $schemecas se produira, en définissant $theschemeHTTPS bien qu'en fait la demande (à haproxy) soit HTTP non sécurisée. - Pour éviter cela, qu'en est-il de: default $http_x_forwarded_proto; '' $scheme;donc si haproxy dit HTTP, il sera respecté.
KajMagnus
Cela est suggéré ici: stackoverflow.com/a/21911864/694469 (ie default $http_x_forwarded_proto;).
KajMagnus
2

J'avais le même besoin avec AWS ELB

Voici ma ligne de résolution:

proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto;
jobwat
la source
Dois-je parier mettre $http_x_forwarded_protoquelque part? Qu'est-ce que c'est?
Jonathan
developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… $ http_x_forwarded_proto est l'implémentation
NGINX
2
Vous répondez vient de résoudre un problème auquel je m'attaque depuis 3 jours! Tous les autres articles sur le sujet des équilibreurs de charge aws avec https advocate proxy_set_header X-Forwarded-Proto $scheme;, ce qui ne fonctionne pas
MikeMarsian
1

Je ne peux pas simplement commenter, donc je poste ceci comme une réponse: pourriez-vous nous donner une partie ou la totalité de votre configuration nginx afin que nous puissions voir ce qui ne va pas? Peut-être aussi votre configuration HAProxy?

Le premier problème auquel je peux penser est que votre HAProxy fait une terminaison ssl. Pour résumer, pour décharger vos serveurs backend, un équilibreur de charge peut être configuré pour faire tout le ssl, puis communiquer avec vos serveurs backend en HTTP. Comme le schéma ici: http://blog.exceliance.fr/2012/09/10/how-to-get-ssl-with-haproxy-getting-rid-of-stunnel-stud-nginx-or-pound/

Pour vous donner une bonne réponse à votre question, pourriez-vous vérifier que vous n'avez aucun problème de bouclage dans votre configuration http <> https? Peut-être que vous pourriez alors rediriger http vers http, https vers https, puis forcer http à être redirigé vers https.

Pourriez-vous également vérifier que vous avez activé le passthrough SSL dans votre configuration HAProxy?

Yannovitch
la source
Avez-vous résolu votre problème?
Yannovitch
1
Je l'ai compris. Votre réponse n'a pas aidé directement, mais ce deuxième lien m'a aidé à trouver un moyen de le résoudre. Merci.
Echo dit Réintégrer Monica