Umleitungsschleife mit Cloudflare's Flexible ssl

10

Ich versuche, von CloudFlare bereitgestelltes flexibles SSL für meine Site zu implementieren.

Hier ist meine Nginx-Konfiguration:

# PHP-FPM upstream; change it accordingly to your local config!
upstream php-fpm {
    server 127.0.0.1:9000;
}

server {
    listen         80;
    server_name    example.com www.example.com;
    return         301 https://$server_name$request_uri;
}

server {
    ## Listen ports
    listen 443;

    # use _ if you want to accept everything, or replace _ with domain
    server_name example.com www.example.com;

    location / {
      #proxy_set_header        X-Forwarded-Proto $scheme;
      proxy_set_header X_FORWARDED_PROTO https;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header  Host $http_host;
      proxy_set_header  X-Url-Scheme $scheme;
      proxy_redirect    off;
      proxy_max_temp_file_size 0;
    }

(...rest of config...)

Wenn ich jedoch versuche, eine Verbindung zur Website (Wordpress) herzustellen, wird eine Umleitungsschleife angezeigt (Chrome: ERR_TOO_MANY_REDIRECTS). Wie konfiguriere ich nginx, um dies zu verhindern?

Deqq
quelle

Antworten:

30

Die flexible SSL von Cloudflare bedeutet, dass die Verbindung zwischen Cloudflare und Ihrem Server immer über http:

Verbindung ist immer http

Vor diesem Hintergrund ist der einzige Serverblock in der Frage der Relevanz dieser:

server {
   listen         80;
   server_name    example.com www.example.com;
   return         301 https://$server_name$request_uri;
}

Es sollte offensichtlich sein, warum dies zu einer Umleitungsschleife führt. Es gibt zwei Lösungen, um https-Verbindungen mithilfe ihrer flexiblen SSL-Lösung zu erzwingen.

Verwenden Sie die Seitenregeln von Cloudflare

Wenn der Zugriff auf den Server ausschließlich über Cloudflare erfolgt, können Sie die eigenen Seitenregeln von Cloudflare verwenden , um die Antworten für eine Domain, Subdomain oder ein beliebiges URL-Muster zu ändern:

Verwenden der Seitenregeln von Cloudflare

Eine der Optionen besteht darin, https zu erzwingen:

Verwenden Sie immer HTTPS

Prüfung $http_x_forwarded_proto

Es gibt Zeiten, in denen Sie die Verwendung von Seitenregeln vermeiden möchten (sollte selten oder nur vorübergehend sein). In diesen Szenarien ist es möglich, das weitergeleitete Protokoll zu testen und basierend darauf umzuleiten:

server {
   listen         80;
   server_name    example.com www.example.com;

   if ($http_x_forwarded_proto = "http") {
     return 301 https://$server_name$request_uri;
   }

   ... directives to generate a response
}
AD7six
quelle
Und wird es Fehler in meinen https-Verbindungen geben, zum Beispiel, dass in diesem Fall nicht alles über http übertragen wird?
Deqq
Wie Sie cloudflare / nginx einrichten, hat keinen Einfluss darauf. Der HTML- Inhalt bestimmt, ob solche Fehler gemeldet werden.
AD7six
Die erste Zeile dieser Antwort ist falsch: Die Verbindung zwischen dem Browser und CloudFlare ist TLS-verschlüsselt, die Verbindung von CloudFlare zum Ursprungsserver ist http. Umleitungsschleifen können durch Seitenregeln oder Einstellungen auf hoher Ebene verursacht werden, die den Verschlüsselungstyp falsch angeben - z. B. voll, wenn Sie wirklich flexibel sind.
Tim
Es gibt auch ein Plugin, das dabei hilft: en-nz.wordpress.org/plugins/cloudflare-flexible-ssl
Tim
5

Dies kann das Problem beheben, wenn Sie über ein gültiges SSL-Zertifikat verfügen. Feld [Krypto] und wählen Sie Full (strict)wie im Bild. Geben Sie hier die Bildbeschreibung ein

Es ist wirklich nicht nötig, die Webserver-Konfigurationsdatei für Nginx zu aktualisieren.

Prosti
quelle
Voll (streng) funktioniert nur, wenn der Ursprungswebserver über ein gültiges SSL-Zertifikat mit einer gültigen Zertifikatkette verfügt. Vollständig funktioniert mit jedem SSL-Zertifikat, einschließlich selbstsigniert. Dies ist keine gute Antwort auf die Frage.
Tim
Ja, ich sehe jetzt, die Frage erwähnte das flexible Zertifikat. Ich werde meine Antwort dank Ihres Feedbacks verbessern und genauer darauf eingehen. Wir verbessern hier die Wissensbasis. Ein gültiges SSL-Zertifikat hat den besten Wert für Google, wenn wir die SEO-Perspektive berücksichtigen. Ich bereue es nicht, nachdem ich dies gepostet habe.
Prosti
Flexibel / voll / streng macht für SEO keinen Unterschied, diese Einstellung gilt für die Verbindung zum Ursprungsserver. Cloudflare stellt jedem, der die Seite anfordert, ein freigegebenes https-Zertifikat zur Verfügung. Die Verbindung zum Ursprung ist weitgehend irrelevant.
Tim
Angenommen, der Server verfügt über ein gültiges SSL-Zertifikat (das OP gibt es nicht an, und ich bin über eine ähnliche Konfigurations-Google-Datei hierher gekommen), ist dies eine großartige Option. Beachten Sie, dass es auch über die Seitenregeln auf eine bestimmte Subdomain beschränkt werden kann.
Skoczen
Dies ist eine super gute Antwort für mich, die ein gültiges SSL hatte.
Philip
0

Die Antwort von AD7six ist sehr gut, obwohl es anscheinend eine einfachere Lösung gibt, für die keine Seitenregeln erforderlich sind. Ich bin mir nicht sicher, ob dies ein Neuzugang seit den vorherigen Antworten ist, aber es sollte auf jeden Fall zu dieser Frage dokumentiert werden, insbesondere da Sie zum Zeitpunkt des Schreibens nur 3 kostenlose Seitenregeln mit Cloudflare erhalten.

Wenn Sie Flexible SSL für eine bestimmte Domain Cryptoaktiviert haben , können Sie auf der Registerkarte nach unten scrollen und die Always use HTTPSOption aktivieren . Diese Option löst das Problem der Umleitungsschleife nahtlos (ausführlich in der Antwort von AD7six erläutert ).

Cloudflares Option "Immer HTTPS verwenden"

Diese Option wurde für die Arbeit mit Nginx bestätigt. Darüber hinaus sollte es kein Server-Setup geben, bei dem diese Option nicht funktioniert, vorausgesetzt, Flexible SSL ist bereits aktiviert und funktioniert ohne Probleme.

Tschad
quelle
Wenn sich die Benutzeroberfläche von Cloudflare geändert hat (oder neue Optionen verfügbar gemacht wurden), ist es besser, die vorhandene Antwort zu bearbeiten, als eine konkurrierende zu erstellen.
AD7six
@ AD7six Ich glaube, dies ist eine Ergänzung zur alten Benutzeroberfläche, kein Ersatz, was bedeutet, dass die alte Antwort noch gültig sein sollte. Daher wäre eine separate Antwort logischer als die Bearbeitung des Originals, nicht wahr?
Chad
Ich glaube nicht "Früher mussten Sie das auf lange Sicht tun, aber jetzt gibt es einen Knopf dafür!" ist eine neue Antwort, nein :).
AD7six