Redireccione todo el tráfico HTTP a HTTPS cuando use HTTP (S) Load Balancer en Google Compute Engine

18

Tengo el equilibrio de carga HTTP / HTTPS configurado en Google Compute Engine con 2 reglas de reenvío globales (HTTP y HTTPS). Cada regla apunta a un servicio de fondo con un protocolo de HTTP.

Quiero http://*ir a todas las solicitudes https://*.

A medida que el equilibrador de carga habla con los servicios de fondo a través de HTTP, no creo que pueda obtener nginx en el servicio de fondo para enviar a 301.

He intentado una docena de pequeños ajustes en Google Compute y todos terminan con Google Compute devolviendo a 502.

Estoy seguro de que alguien más ha configurado esto antes. Cualquier sugerencia o puntero en la dirección correcta es muy apreciada.

Ryan Leckey
fuente
La redirección de HTTP a HTTPS (usando SSL) actualmente no es compatible a través del equilibrador de carga HTTP / HTTPS. La redirección debe configurarse en su servidor web (apache, nginx, etc.). Dicho esto, no dude en presentar una solicitud de función para esto en el rastreador de problemas públicos de Compute Engine ( code.google.com/p/google-compute-engine/issues/list ).
Faizan
Gracias; abrió un problema: code.google.com/p/google-compute-engine/issues/…
Ryan Leckey
Ok, perfecto, he enviado la solicitud de características a ingeniería.
Faizan
@Faizan: ¿hay una línea de tiempo cuando esta función estará disponible? Han pasado alrededor de 2 años desde que se solicitó la función. La solución es torpe.
talonx
El nuevo enlace para esta solicitud es issuetracker.google.com/issues/35904733 (aunque el anterior aún redirige).
Daniel Compton

Respuestas:

19

Tenemos una configuración similar usando el equilibrador de carga HTTP / HTTPS y logramos forzar HTTPS. No es posible directamente desde el equilibrador de carga, pero puede configurarlo desde su servicio de back-end. El equilibrador de carga de Google Cloud establecerá el encabezado http X-Fordered-Proto con el valor http o https. Verifica este encabezado en su servicio de back-end (en nuestro caso, Barniz, pero esto también podría hacerse en Nginx) y si el valor es http, entonces envía un 301.

Lennert Kuijpers
fuente
8
¡Gracias! En aras de la posteridad: if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; }
Ryan Leckey
Debe usar el 426encabezado de actualización HTTP en lugar de 301. Lea más: stackoverflow.com/questions/17873247/…
Vikram Tiwari
3
No estoy de acuerdo con Vikram, debes usar un 301 para fines de SEO. Si devuelve un código de familia 4xx, su pagerank no fluirá a través de enlaces que apuntan a la antigua http a https. 301 es el código esperado, al menos si te importa el SEO en tu sitio.
cyrrill
1
@VikramTiwari, la respuesta de la publicación en realidad dice: "Ni siquiera se trata de actualizar de http: // a https: // en absoluto"
Rambatino
1

Enfrenté este problema hoy y pude resolverlo usando el equilibrio de carga TCP. Si no necesita las opciones de equilibrador de carga específicas de HTTP / HTTPS, quizás pueda usar el equilibrador de carga TCP (sin SSL) para recibir tráfico tanto en el puerto 80 como en el 443. Para el tráfico desde el puerto 80, puede enviar de vuelta 301.

gselva
fuente
1
tcp balanceo de carga no está permitido para el puerto 80 doc > TCP Proxy Load Balancing admite los siguientes puertos: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222
Giovanni Toraldo