Hier ist meine abgekürzte Nginx Vhost Conf:
upstream gunicorn {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 80;
listen 443 ssl;
server_name domain.com ~^.+\.domain\.com$;
location / {
try_files $uri @proxy;
}
location @proxy {
proxy_pass_header Server;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 10;
proxy_read_timeout 120;
proxy_pass http://gunicorn;
}
}
Der gleiche Server muss sowohl HTTP als auch HTTPS bedienen. Wenn der Upstream jedoch eine Umleitung ausgibt (z. B. nachdem ein Formular verarbeitet wurde), werden alle HTTPS-Anforderungen an HTTP umgeleitet. Das Einzige, was ich gefunden habe, um dieses Problem zu beheben, ist proxy_redirect
folgende Änderung :
proxy_redirect http:// https://;
Das funktioniert wunderbar für Anfragen, die von HTTPS kommen, aber wenn eine Umleitung über HTTP erfolgt, wird dies auch an HTTPS weitergeleitet, was ein Problem darstellt.
Aus Verzweiflung versuchte ich:
if ($scheme = 'https') {
proxy_redirect http:// https://;
}
Aber Nginx beschwert sich, dass proxy_redirect
das hier nicht erlaubt ist.
Die einzige andere Option, die ich mir proxy_redirect
vorstellen kann, besteht darin, die beiden Server separat zu definieren und nur auf den SSL- Server zu setzen , aber dann hätte ich den Rest der conf dupliziert (es gibt eine Menge in der server
Direktive, die ich der Einfachheit halber weggelassen habe). Ich weiß, ich könnte auch eine include
Direktive verwenden, um die Redundanz auszugleichen, aber ich möchte wirklich nur eine conf-Datei ohne Abhängigkeiten behalten.
Gibt es also etwas, das ich vermisse, um das Problem vollständig zu beseitigen? Oder, wenn nicht, gibt es eine andere Möglichkeit (abgesehen von einer externen Datei), die redundanten Konfigurationsinformationen herauszufiltern, damit ich die HTTP- und HTTPS-Versionen der Serverkonfiguration trennen kann?
Die andere Lösung besteht darin, dem Upstream anzuzeigen, ob die Anforderung HTTP oder HTTPS ist, und die entsprechende Umleitung ausgeben zu lassen. Wenn Sie dies in der nginx-Konfiguration hinzufügen, wird ein Header festgelegt, den der Upstream überprüfen soll.
quelle