Nginx: Umschreiben von https:// in http://

Nginx: Umschreiben von https:// in http://

Ich versuche, Nginx dazu zu bringen, eingehende Anfragen an eine Site umzuschreiben, die meinem Server das Präfix „ https://to“ http://vorangestellt hat (das liegt daran, dass ein auf dieser Site verwendetes CMS URIs anstelle von relativen Pfaden erzwingt – was im Wesentlichen die ganze Site kaputt macht, da Bilder, Skripte und Stylesheets nicht mehr verfügbar sind).

Ich versuche derzeit, eine bestehende Direktive eines Vorgängers nachzurüsten, bin dabei aber durch meine Kenntnisse der Nginx-Konfigurationssyntax eingeschränkt. Hier ist der Code:

if ($ssl_protocol = "") {
    rewrite ^   https://$http_host$request_uri? permanent;
}

Ich habe diesen Code auskommentiert, um ein erzwungenes Umschreiben von zu verhindern http://, https://aber ich kann den Vorgang nicht rückgängig machen, ohne die Site zu beschädigen. Folgendes habe ich bisher versucht:

if ($ssl_protocol = "https") {
    rewrite ^   http://$http_host$request_uri? permanent;
}

Und

# also tried ($ssl_protocol != "")
if (!($ssl_protocol = "")) {
    rewrite ^   http://$http_host$request_uri? permanent;
}

Die erste scheint keine Wirkung zu haben. Das an den Client gesendete HTML stellt weiterhin HTTPS-Anfragen, die nicht neu geschrieben werden.

Der zweite Codeausschnitt scheint auch keine Wirkung zu haben – wenn ich das richtig verstehe (obwohl ich immer noch etwas überrascht bin), unterstützt Nginx keine Boolesche Negation.

Was wäre der beste (oder funktionierende) Weg, dies zu tun?

BEARBEITEN:Ich habe versucht, den Code aus der Antwort von @NathanC hinzuzufügen. Dieses unbedingte Umschreiben führt jedoch zu einer Umleitungsschleife. Hilfe ist trotzdem willkommen.

Antwort1

Der sauberere Weg wäre:

if ( $scheme = "https" ) {
    return 301 http://example.com$request_uri

oder irgendwo zwischen dieser und Nathans Antwort, wo Ihr Standard-SSL-Server-Block einfach diereturn 301 (egal um welchen SSL-Block es sich handelt, Sie müssen sich Ihren genau ansehen, um zu sehen, wie er implementiert ist, und ihn anpassen)Es macht keinen Sinn, für eine einfache Umleitung reguläre Ausdrücke zu verwenden

return-http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

Bearbeiten: Mir ist gerade aufgefallen, dass es eine Variable gibt $https, die stattdessen in der if-Anweisung verwendet werden kann.Gibt zurück " ", wenn nicht https:

if ( $https = "on" ) {
    ...

Denken Sie daran, dass Sie beim Testen von Änderungen eine 302temporäre statt 301einer permanenten Weiterleitung verwenden sollten, damit Sie sich keine Haare raufen müssen, wenn Sie feststellen, dass Sie das Problem zwar eine Stunde zuvor behoben haben, die Änderungen aber nicht in Ihrem Browser angezeigt wurden :)

Antwort2

Das ist nicht einmal nötig, da Sie den gesamten https-Verkehr einfach über http abwickeln können, und zwar folgendermaßen:

server {
        listen 443;
        ssl on;
        server_name example.com;
        rewrite ^(.*) http://example.com$1 permanent;
 }

Referenz:https://stackoverflow.com/questions/3470290/nginx-redirect-https-to-http

verwandte Informationen