mit nginx, wobei die Basis-URL auf https umgeschrieben wird

mit nginx, wobei die Basis-URL auf https umgeschrieben wird

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

verwandte Informationen