Leiten Sie den gesamten HTTP-Datenverkehr an HTTPS um, wenn Sie den HTTP (S) Load Balancer in Google Compute Engine verwenden

18

Ich habe einen HTTP / HTTPS-Lastenausgleich in Google Compute Engine mit zwei globalen Weiterleitungsregeln (HTTP und HTTPS) eingerichtet. Jede Regel verweist auf einen Back-End-Dienst mit einem HTTP-Protokoll.

Ich möchte, dass alle Anfragen http://*an gehen https://*.

Da der Load Balancer über HTTP mit den Back-End-Diensten kommuniziert, glaube ich nicht, dass ich Nginx über den Back-End-Dienst zum Zurücksenden von A veranlassen kann 301.

Ich habe ein Dutzend kleiner Optimierungen bei Google Compute ausprobiert, und am Ende gibt Google Compute a zurück 502.

Ich bin sicher, jemand anderes hat das schon einmal eingerichtet. Alle Tipps oder Hinweise in die richtige Richtung werden sehr geschätzt.

Ryan Leckey
quelle
Die HTTP-zu-HTTPS-Umleitung (mit SSL) wird derzeit nicht über den HTTP / HTTPS-Lastenausgleich unterstützt. Die Umleitung muss auf Ihrem Webserver (Apache, Nginx usw.) konfiguriert werden. Zögern Sie nicht, einen entsprechenden Funktionsantrag im öffentlichen Issue-Tracker von Compute Engine ( code.google.com/p/google-compute-engine/issues/list ) einzureichen .
Faizan
Vielen Dank; öffnete ein Problem: code.google.com/p/google-compute-engine/issues/…
Ryan Leckey
Ok perfekt, ich habe die Feature-Anfrage an das Engineering weitergeleitet.
Faizan,
@Faizan - Gibt es eine Zeitleiste, in der diese Funktion verfügbar sein wird? Es ist ungefähr 2 Jahre her, seit das Feature angefordert wurde. Die Problemumgehung ist umständlich.
Talonx
Der neue Link für diese Anfrage lautet issuetracker.google.com/issues/35904733 (der alte leitet jedoch weiter).
Daniel Compton

Antworten:

19

Wir haben eine ähnliche Konfiguration mit dem HTTP / HTTPS-Load-Balancer und es ist uns gelungen, HTTPS zu erzwingen. Es ist nicht direkt über den Load Balancer möglich, aber Sie können es über Ihren Backend-Service einrichten. Der Google Cloud Load Balancer setzt den X-Forwarded-Proto-HTTP-Header entweder auf den Wert http oder auf https. Sie überprüfen diesen Header in Ihrem Back-End-Service (in unserem Fall Varnish, dies könnte aber auch in Nginx geschehen) und wenn der Wert http ist, senden Sie eine 301 zurück.

Lennert Kuijpers
quelle
8
Vielen Dank! Der Nachwelt zuliebe: if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; }
Ryan Leckey
Sie sollten HTTP- 426Upgrade-Header anstelle von 301 verwenden. Weitere Informationen
Vikram Tiwari,
3
Ich bin anderer Meinung als Vikram. Sie müssen eine 301 für SEO-Zwecke verwenden. Wenn Sie einen 4xx-Familiencode zurückgeben, wird Ihr Pagerank nicht von Links, die auf das alte http verweisen, zu https übertragen. 301 ist der erwartete Code, zumindest wenn Sie sich für SEO auf Ihrer Website interessieren.
Cyrrill
1
@ VikramTiwari, die Antwort in der Post lautet tatsächlich: "Es geht überhaupt nicht um ein Upgrade von http: // auf https: //"
Rambatino
1

Ich war heute mit diesem Problem konfrontiert und konnte es mithilfe des TCP-Lastenausgleichs beheben. Wenn Sie die HTTP / HTTPS-spezifischen Lastausgleichsoptionen nicht benötigen, können Sie möglicherweise den TCP-Lastausgleich (kein SSL) verwenden, um Datenverkehr zu Port 80 und 443 zu empfangen. Für Datenverkehr von Port 80 können Sie 301 zurücksenden.

gselva
quelle
1
TCP- Lastausgleich ist für Port 80 nicht zulässig doc > TCP-Proxy- Lastausgleich unterstützt die folgenden Ports: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222
Giovanni Toraldo,