Bucle de redireccionamiento sin fin con AWS ELB y sitio de wordpress usando el complemento https de wordpress

11

He configurado un AWS ELB para apuntar a mi servidor Ubuntu que ejecuta Wordpress 3.2.1. Todo funcionó muy bien en el servidor hasta que lo puse detrás de un equilibrador de carga.

Configuré el equilibrador de carga para reenviar el puerto 80 al puerto 80 y el puerto 443 al puerto 80.

Configuré mi archivo de hosts virtuales para verificar los encabezados del elb:

RewriteEngine en
RewriteCond% {HTTP: X-Fordered-Proto}!
Https RewriteRule! / Status https: //% {SERVER_NAME}% {REQUEST_URI} [L, R]

Ahora, cada vez que voy a una URL https me sale este mensaje:

Esta página web tiene un bucle de redireccionamiento
La página web en https://mywebsite.com/securepage/ ha dado como resultado demasiados redireccionamientos

Tan pronto como desactive el complemento https de wordpress
( http://wordpress.org/extend/plugins/wordpress-https/ )
Las páginas funcionan pero ahora están llenas de contenido mixto. las páginas que deberían ser https ya no son https.

Tan pronto como accedo al servidor directamente en lugar de a través del elb, vuelve a funcionar.

¿Alguna idea sobre cómo podría hacer que esto funcione con un AWS ELB?

PolloPiel
fuente
¿Has actualizado el enlace permanente? por lo general, tenemos que actualizar la configuración del
enlace

Respuestas:

13

Me arriesgaría a adivinar sin que publique su configuración de ELB que el ELB está redirigiendo el tráfico HTTPS (443 / tcp) a la instancia EC2 en HTTP (80 / tcp). Entonces, usted .htaccessy el complemento están intentando redirigirlo de nuevo a HTTPS porque se está viendo a través de HTTP.

Eche un vistazo a su consola EC2 debajo Network & Security > Load Balancersy me imagino que verá el dicho Port Configurationalgo en la línea de443 forwarding to 80 (HTTPS, Certificate: blah)

Jeremy Bouse
fuente
1
Esta persona aquí estaba teniendo el mismo problema. forums.aws.amazon.com/…
ChickenFur
1
y este parece similar stackoverflow.com/questions/5741210/…
ChickenFur
a la derecha estoy enviando 443 a 80.
ChickenFur
Llevo más de 2 años con uno de mis clientes bajo AWS ... Cuando leí tu pregunta, esa fue la primera cosa que se me ocurrió como sospechoso.
Jeremy Bouse
1
Cambiar el LB al punto de 443 a 443 lo arregló :) ¡Gracias!
ChickenFur
17

Intenta agregar esto a tu httpd.confo un.htaccess

SetEnvIfNoCase X-FORWARDED-PROTO "^https$" HTTPS

Cuando utiliza el equilibrador de carga + HTTPS, su servidor web no es consciente de que HTTPS se está utilizando en el front-end, por lo que sigue intentando redirigir al sitio HTTPS, cuando de hecho, HTTPS ya se está utilizando.

Lo anterior traducirá el encabezado que Load Balancer de Amazon envía ( X-Forwarded-Proto: https) a una variable de entorno que Wordpress y otros scripts PHP entienden ( HTTPS=1)

AB Carroll
fuente
3
Esto sería manera correcta de hacerlo, como restos de descifrado SSL en ELB
Toske
1
Si estás en nginx, una adición similar sería:fastcgi_param HTTPS on;
Akash Budhia
Esta publicación terminó mi dolor de una hora ... THX
Daywalker
3

De acuerdo con Amazon aquí https://d0.awsstatic.com/whitepapers/deploying-wordpress-with-aws-elastic-beanstalk.pdf la solución es:

/** Detect if SSL is used. This is required since we are terminating SSL either on CloudFront or on ELB */ 
if (($_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] == 'https') OR ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
    {$_SERVER['HTTPS']='on';}

Todavía terminé con el bucle sin fin, así que cambié mi configuración de WordPress a partir de:

define('WP_HOME','http://www.example.com');
define('WP_SITEURL','http://www.example.com');

a:

define('WP_HOME','https://www.example.com');
define('WP_SITEURL','https://www.example.com');

Esto obligará a los usuarios a https, incluso si escriben http, además, facilita el desarrollo del sitio fuera de línea porque solo actualiza WP_HOME al host local y https ya no es el predeterminado

brianlmerritt
fuente
1

Citando a mí mismo de otra publicación útil /server//a/858308/450836 :

Para mí fue suficiente establecer $ _SERVER ['HTTPS'] = 'on'; en wp-config.php. Estoy usando AWS ELB que termina SSL en el ELB. Por lo tanto, nginx acepta la solicitud en el Puerto 80 (8080 después del barniz) y parece que wordpress no pudo manejarlo hasta que explícitamente le diga a PHP que el sitio ya usa https ...

Para el oyente ELB no SSL, uso una configuración separada para redirigir todo el tráfico a https como oyente predeterminado.

Tim
fuente
0

Como sugirió @Tim, esto $_SERVER['HTTPS']='on';en wp-config.php hizo el truco para mí.

También agregué esto a mi archivo .htaccess para forzar HTTPS:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]
Jordán
fuente
0

Solución para demasiados problemas de redireccionamiento en aws ALB

Habilite el módulo de encabezado y luego agregue la siguiente entrada en la configuración de apache

SetEnvIf X-Fordered-Proto "https" HTTPS = en RequestHeader establece HTTPS "en" env = HTTPS

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
George Ulahannan
fuente