Nginx: Header auf HTTP entfernen, Header auf HTTPS hinzufügen

7

Ich konfiguriere einen Nginx-Server so, dass er als Reverse-Proxy für eine Django-App (auf Gunicorn ausgeführt) dient.

Mein Problem ist, dass ich möchte, dass meine Site mit HTTPS gesichert wird, und dass meine Django-App feststellen kann, ob eine Verbindung sicher ist oder nicht. Ich verwende Django 1.4, habe also Zugriff auf das SECURE_PROXY_SSL_HEADER, als das ich konfiguriert habe SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https').

Wie in der Dokumentation erwähnt, muss ich jetzt sicherstellen, dass Nginx den Header nur bei Bedarf hinzufügt und ihn entfernt, wenn dies nicht der Fall ist. Da ich möchte, dass meine Nginx-Konfiguration so trocken wie möglich ist, hätte ich lieber keine zwei Konfigurationsdateien (eine für Port 80 und eine für Port 443).

Daher möchte ich wissen, ob es in Nginx eine Möglichkeit gibt, festzustellen, ob die Verbindung https ist, und einen Header entsprechend hinzuzufügen (oder zu entfernen).

Thomas Orozco
quelle
Warum nicht einfach immer den Header mit dem Verbindungsprotokoll setzen?
Shane Madden
1
Das ist der Grund, warum ich auf die Idee gekommen bin, die $schemeVariable vorher nicht zu kennen !
Thomas Orozco

Antworten:

13

Diese Lösung beschreibt nicht , wie ein Header nur über HTTP entfernt wird, wie im Fragentitel angegeben.

Eine sichere Lösung für Ihr Problem ist das Hinzufügen

proxy_set_header  X-Forwarded-Protocol  $scheme;

Es wird festgelegt , X-Forwarded-Protocolum httpauf HTTP - Anfragen und httpsauf HTTPS - Anfragen.

Dadurch wird sichergestellt, dass dieser Header überschrieben wird, wenn der Client ihn gemäß https://docs.djangoproject.com/de/1.4/ref/settings/#secure-proxy-ssl-header festgelegt hat .


HINWEIS: Wenn Sie Ihr Django - Projekt gemeinsam nutzen, stellen Sie bitte sicher genug über diese Benutzer zu warnen , wenn Sie einschließlich SECURE_PROXY_SSL_HEADERin settings.pyund bestem Kommentar es standardmäßig aus.

nh2
quelle