Derzeit habe ich eine ELB, die sowohl http://www.example.org als auch https://www.example.org bedient .
Ich möchte es so einrichten, dass jede Anfrage, die auf http://www.example.org verweist, auf https://www.example.org umgeleitet wird .
Die ELB sendet die https-Anforderungen als http-Anforderungen. Verwenden Sie dazu:
server {
listen 80;
server_name www.example.org;
rewrite ^ https://$server_name$request_uri? permanent;
}
funktioniert nicht, da Anforderungen an https://www.example.org weiterhin an Port 80 unter nginx gesendet werden.
Ich weiß, es ist möglich, es als umzuschreiben
server {
listen 80;
server_name www.example.org;
if ($http_x_forwarded_proto != "https") {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
}
Aber alles, was ich gelesen habe, if
sollte unbedingt in der Nginx-Konfiguration vermieden werden, und dies wäre für jede einzelne Anfrage. Dies bedeutet auch, dass ich eine spezielle separate Konfiguration für die Integritätsprüfung einrichten muss ( wie hier beschrieben : "... wenn Sie sich hinter einer ELB befinden, wobei die ELB als HTTPS-Endpunkt fungiert und nur HTTP-Datenverkehr an Ihren Server sendet, Sie brechen Sie die Fähigkeit, mit einer HTTP 200 OK-Antwort auf die Integritätsprüfung zu antworten, die der ELB benötigt ").
Ich denke darüber nach, den Login in den Code der Webanwendung und nicht in die Nginx-Konfiguration zu schreiben (und für die Zwecke dieser Frage nehmen wir an, dass es sich um eine Django-basierte Anwendung handelt), aber ich bin nicht sicher, ob dies mehr Aufwand bedeutet als die if
in Konfiguration.
Antworten:
Wenn es so richtig funktioniert, fürchte dich nicht davor. http://wiki.nginx.org/IfIsEvil
quelle
location {}
,server {}
stattdessen. (Aber bitte lassen Sie mich wissen, wenn dies falsch ist!)NGINX-Setup
quelle
HTTP:1443
. Es lehnt das ab,HTTP:80
weil das 301 umleitet.Diese Lösung verwendet bedingte Logik, aber wie die akzeptierte Antwort nahelegt, denke ich auch, dass dies in Ordnung ist. Ref: https://stackoverflow.com/questions/4833238/nginx-conf-redirect-multiple-conditions
Dazu müssen in den aws-Sicherheitseinstellungen für das Image keine zusätzlichen Ports geöffnet werden. Sie können ssl in der AWS LB beenden und den https-Verkehr an den http-Port 80 Ihrer Instanz weiterleiten.
In diesem Beispiel trifft der LB-Health-Check / Health auf Port 80, der zum App-Server weitergeleitet wird, sodass der Health-Check überprüft, ob sowohl Nginx als auch Ihre App atmen.
quelle
Sie können jetzt in den AWS Load Balancer-Einstellungen einen neuen Listener erstellen, der HTTP-Port 80 an HTTPS-Port 443 umleitet. Sie müssen also nicht mehr die Konfiguration von nginx / apache berühren.
quelle