2016-10-11 11 views
0

Wir haben dieses Problem seit Ewigkeiten, und es beginnt uns in den Arsch beißen. Wir betreiben eine Site für einen Client in Python auf dem Django-Framework. Wir benutzen dann nginx als Webserver/Proxy für django. Dies ist normalerweise das Standard-Setup und funktioniert gut.Nginx auf https von http auf dem gleichen server_name Block umschreiben, wenn ssl Downstream behandelt wird

Das Problem ist, dass unser Client einen anderen Apache-Server höher hat. Dieser Server wickelt die SSL-Terminierung ab und leitet Anfragen nur über normales http an uns weiter. Der Apache-Server akzeptiert sowohl HTTP als auch HTTPS für 2 Domänennamen.

Wir können leicht http zu https auf Nginx-Ebene umschreiben, aber das Problem kommt, dass ein Benutzer https entfernen und einfach http verwenden kann.

Gibt es einen Weg auf Nginx-Ebene, um Benutzer zurück zu https://secure.example.com zu zwingen, wenn sie auf http://secure.example.com sind.

Dank

+0

„Wir können leicht http umschreiben zu https auf nginx Ebene, aber das Problem kommt, dass ein Benutzer kann https entfernen und nur verwenden http“ - könnte Du erklärst das besser? Wenn Sie "Neuschreiben" sagen, meinen Sie eigentlich "Neuschreiben"? Oder meinst du "Redirect"? Weiß nginx, ob die ursprüngliche Anfrage mit https war und wie? Warum kannst du die Umleitung nicht in Apache machen? –

+0

Ja, ich meinte Redirect. Nginx weiß nicht, ob die Anfrage https war. Wir kontrollieren Apache nicht, und es ist unglaublich schwierig, auf diesem Level etwas zu erreichen. An diesem Punkt versuchen wir zu sehen, ob wir nur Port 80 auf dieser IP blockieren können. –

+0

Aber wenn nginx (und anschließend Django) nicht weiß, ob die Anfrage https war, wie könnte dann möglicherweise entweder nginx oder Django entscheiden, dass eine Umleitung benötigt wird? Ich sehe keinen Weg ohne Apache zu berühren. Entweder muss Apache die Umleitung ausführen, oder Apache sollte die Information weitergeben, ob die ursprüngliche Anfrage https war (vorzugsweise die zweite). –

Antwort

0

Die übliche Technik ist für den Proxy-SSL-Terminierung Handhabung eines X-Forwarded-Proto Header hinzuzufügen. Die vorgelagerte Anwendung kann dann beim Betreten eines sicheren Bereichs bedingt umleiten.

nginx Mit diesem könnte erreicht werden, indem ein map:

map $http_x_forwarded_proto $insecure { 
    default 1; 
    https 0; 
} 

server { 
    ... 
    if ($insecure) { 
     return 301 https://$host$request_uri; 
    } 
    ... 
} 
+0

Ich habe das versucht. Traurigerweise gibt es mir nur Umleitungsschleifen, da es denkt, dass die Anfrage unsicher ist. –

+0

Es * ist * abhängig davon, dass Downstream den richtigen Header liefert. –

Verwandte Themen