Nginx: Umschreiben von https: // nach http: //

4

Ich versuche , Nginx zu erhalten eingehende Anfragen an eine Stelle neu zu schreiben , mein Server mit dem Präfix https://zu http://(dies ist , weil ein CMS auf dieser Website verwendet zwingt URIs anstelle von relativen Pfaden - im Wesentlichen die gesamte Website zu brechen durch Bilder, Skripte zu machen, und Stylesheets nicht verfügbar).

Ich versuche derzeit, eine vorhandene Direktive eines Vorgängers nachzurüsten, aber meine Kenntnisse der Nginx-Konfigurationssyntax schränken mich ein. Hier ist der Code:

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

Ich habe diesen Code derzeit auskommentiert, um ein erzwungenes Überschreiben von http://to zu verhindern 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;
}

Der erste scheint keine Wirkung zu haben. Der an den Client gesendete HTML-Code sendet weiterhin HTTPS-Anforderungen, die nicht neu geschrieben werden.

Das zweite Snippet scheint ebenfalls keine Wirkung zu haben - wenn ich es richtig verstehe (obwohl ich immer noch etwas überrascht bin), unterstützt Nginx keine boolesche Negation.

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

BEARBEITEN: Ich habe versucht, den Code aus der Antwort von @ NathanC hinzuzufügen. Dieses bedingungslose Umschreiben führt jedoch zu einer Umleitungsschleife. Hilfe wird immer noch geschätzt.

user3620306
quelle

Antworten:

6

Der sauberere Weg wäre:

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

oder irgendwo zwischen diesem und Nathans Antwort, wobei Ihr Standard - SSL - Server - Block enthält einfach den return 301 (je nachdem , was ssl Block ist, werden Sie einen genauen Blick auf Ihrem nehmen müssen , um zu sehen , wie seine Umsetzung und Anpassung) keinen Sinn, zu tun regex für ein einfache Weiterleitung

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

edit: Ich habe gerade bemerkt, 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 Umleitung anstelle einer 301permanenten verwenden sollten, um Haarsträhnen zu vermeiden, wenn Sie feststellen, dass Sie sie eine Stunde zuvor behoben haben, die Änderungen jedoch nicht in Ihrem Browser übernommen haben :)

Peter
quelle
Danke, das scheint zu funktionieren! Ich habe immer noch ein Problem mit einem ERR_INSECURE_RESPONSEEreignis, wenn die Ressourcen angefordert, httpsaber zurückgegeben werden http, aber das sollte eine relativ einfache Lösung sein.
user3620306
es erfordern zurück und der Suche nach der Wurzel , warum es https - Anfragen im Code kann Schritt , wenn Sie sie nicht wünschen, andernfalls glaube ich , dass ein Problem für eingebettete Ressourcen bleiben würde ...
pete
Es war eigentlich Teil der Drupal-Site-Konfiguration. Die Seite ist auf eingestellt https://mysite.com.
user3620306
2
+1 für "Denken Sie daran" Absatz :)
Oleg
0

Sie brauchen dies nicht einmal, da Sie einfach den gesamten https-Verkehr zwingen können, http zu werden:

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

Nathan C
quelle
Schreibe dies in meine nginx.conf, aber ich bekomme * unbekannte Anweisung: "server" in * /etc/nginx/nginx.conf:5.
user3620306
Ich habe es zum Arbeiten gebracht - irgendwie. Mit Ihrem Code gelangt die Seite in eine Umleitungsschleife.
user3620306
Haben Sie irgendwo auf der Website eine Weiterleitung von http zu https? Dieser Code ist insofern ein Hammer, als er alle https in der angegebenen Domain umleitet .
Nathan C
Die Antwort von @ pete löste das Problem mit der Umleitungsschleife - wie er erklärte, erfolgt die Umleitung in seinem Code, wenn die angeforderte URL / URI mit einem https://Schema beginnt .
user3620306
nginx: [emerg] keine "ssl_certificate" für die "ssl" Richtlinie definiert in / etc / nginx / sites-enabled / FILE: 32
Fall