
Ich möchte nur meine Basisdomäne www.domain.com umschreiben inhttps://www.domain.com Standardmäßig lasse ich es in meinem https-Block auf http:// umleiten, wenn es nicht ~uri = "/" (Basisdomäne) oder statischer Inhalt ist.
server {
listen 443;
set $ssltoggle 2;
if ($uri ~ ^/(img|js|css|static)/) {
set $ssltoggle 1;
}
if ($uri = '/') {
set $ssltoggle 1;
}
if ($ssltoggle != 1) {
rewrite ^(.*)$ http://$server_name$1 permanent;
}
}
Also muss ich in meinem http-Block die folgende Umschreibung vornehmen, wenn es https sein soll:
server {
listen 80;
if ($uri = '/') {
set $ssltoggle 1;
}
if ($ssltoggle = 1) {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
}
Wenn ich im http-Block nicht die if-Anweisung $uri = '/' habe, funktioniert https einwandfrei, wenn ich direkt dorthin gehe, aber ich werde nicht umgeleitet, wenn ich wie erwartet zu normalem http gehe. Wenn ich diese In-Anweisung in den http-Block setze, funktioniert innerhalb von Minuten alles nicht mehr. Es funktioniert vielleicht noch für ein paar Anfragen, aber es hört immer nach etwa einer Minute auf. In Browsern bekomme ich für alle Anfragen einfach eine leere Seite. Wenn ich nginx neu starte, funktioniert es weiterhin nicht, bis ich beide if-Anweisungsblöcke aus dem https- und dem http-Block entferne und nginx neu starte. Wenn ich in die Fehlerprotokolle schaue, sehe ich nichts protokolliert. Wenn ich in das Zugriffsprotokoll schaue, sehe ich diese Meldung:
"-" 400 0 "-" "-"
was vermutlich einen 400-Fehler bedeutet. Ich verstehe nicht, warum das bei mir nicht funktioniert. Mein Endziel ist, dass die Basisdomäne nur https unterstützt, während alle anderen Seiten standardmäßig http verwenden. Wie kann ich das erreichen?
Antwort1
Ich habe schließlich $uri in $request_uri geändert, damit Argumente ohne Umleitungsschleifen verarbeitet werden können.
server {
listen 443;
set $ssltoggle 2;
if ($uri ~ ^/(img|js|css|static)/) {
set $ssltoggle 1;
}
if ($request_uri = '/') {
set $ssltoggle 1;
}
if ($ssltoggle != 1) {
rewrite ^(.*)$ http://$server_name$1 permanent;
}
}
Dann habe ich den HTTP-Block so geändert, dass ein sofortiges Umschreiben erfolgt, wenn der Speicherort = / war.
server {
listen 80;
location = / {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
if ($ssltoggle = 1) {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
}
Ich habe die IF-Anweisungen noch, um andere Umschreibungen zu handhaben, und dann wird die gesamte spezifische Bereitstellung darunter durchgeführt. Es ist wahrscheinlich nur meine spezifische Konfiguration, die zu Umleitungsschleifen und Fehlern führt, wenn ich versuche, alles so zu handhaben, wie Christopher es vorgeschlagen hat oder wie ich es ursprünglich in meiner Frage dargestellt habe.
Antwort2
Sie benötigen nicht alle if-Anweisungen. Sie sollten mit Standortanweisungen arbeiten.
server {
listen 80;
#rewrite base (/) to ssl
location = / {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
#serve anything else
location / {
[serve non-ssl page ...]
}
}
server {
listen 443;
#serve base url
location = / {
[serve ssl page ...]
}
#serve assets
location ~ ^/(img|js|css|static)/ {
[serve ssl assets ...]
}
#rewrite anything else
location / {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
}
Dies ist ungetestet und könnte Fehler enthalten, sollte aber funktionieren