Utilizo agentes de escucha HTTP y HTTPS en mi equilibrador de carga clásico de Elastic Load Balancing (ELB). My equilibrador de carga clásico descarga SSL y la conexión de backend escucha en un único puerto HTTP (puerto 80). Cuando intento redirigir el tráfico de HTTP a HTTPS (puerto 443), recibo el error «ERR_TOO_MANY_REDIRECTS».
Descripción corta
El equilibrador de carga clásico no admite el redireccionamiento del tráfico HTTP a HTTPS como característica nativa. Para que esto funcione, debes configurar las reglas de reescritura en las instancias del servidor web detrás del equilibrador de carga clásico.
Configura las reglas de reescritura en los servidores de aplicaciones web para usar el encabezado X-Forwarded-Proto y redirigir las solicitudes que son HTTP. De lo contrario, las reglas de reescritura pueden crear un bucle infinito de solicitudes de redireccionamiento entre tu equilibrador de carga clásico y las instancias detrás de tu equilibrador de carga. Este bucle produce el error «ERR_TOO_MANY_REDIRECTS».
Nota: Los equilibradores de carga de aplicación admiten acciones de redireccionamiento que se pueden usar para redirigir el tráfico HTTP a HTTPS. Para usar esta característica, migra tu equilibrador de carga clásico a un equilibrador de carga de aplicación.
Resolución
Revisa los siguientes ejemplos de configuraciones para servidores web Apache, NGINX e IIS. Configura los servidores web detrás de tu equilibrador de carga clásico para que usen el encabezado X-Forwarded-Proto para dirigir el tráfico en función de si los clientes usan HTTP o HTTPS. Asegúrate de agregar reglas de reescritura a tus servidores web que:
- Usen HTTP para redirigir a los clientes a una URL HTTPS
- Usen HTTPS para atender directamente a los clientes
Nota: Modifica los siguientes ejemplos de configuración en función de tu configuración y caso de uso.
Servidores Apache: Método de archivo de host virtual
Se recomienda utilizar el siguiente método para configurar los servidores web:
-
Abre el archivo de configuración de Apache. Entre las posibles ubicaciones se incluyen /etc/httpd/conf/httpd.conf (Apache 2/httpd), /etc/apache2/sites-enabled/ (Apache 2.4) o /etc/apache2/apache2.conf (Apache en Ubuntu).
-
Agrega una regla de reescritura a la sección de host virtual de tu archivo de configuración similar a la siguiente:
<VirtualHost *:80>RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
-
Guarda el archivo de configuración de Apache.
-
Reinicia Apache.
Servidores Apache: método de archivo .htaccess
Si no tienes acceso al archivo de configuración principal de Apache, utiliza los archivos .htaccess. Para obtener más información, consulta la sección Cuándo (no) usar los archivos .htaccess en la página Tutorial del servidor HTTP Apache: archivos .htaccess del sitio web de Apache.
Para configurar los servidores web, sigue estos pasos:
-
Abre el archivo de configuración de Apache. Entre las posibles ubicaciones se incluyen /etc/httpd/conf/httpd.conf (Apache 2/httpd) o /etc/apache2/sites-enabled/ (Apache 2.4).
-
Edita la directiva de directorio para activar .htaccess:
<Directory "/var/www/html"> Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
-
Guarda el archivo de configuración de Apache.
-
Abre el archivo .htaccess.
-
Agrega una regla de reescritura similar a la siguiente:
RewriteEngine OnRewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
-
Guarda el archivo .htaccess.
-
Reinicia Apache.
Servidores NGINX
Nota: Esta resolución se aplica a NGINX 1.10.3 (Ubuntu) y NGINX 1.12.1 (Amazon Linux).
Sigue estos pasos:
-
Abre el archivo de configuración de NGINX (nginx.conf).
-
Agrega la siguiente regla de reescritura. Asegúrate de modificar la regla de reescritura de tu configuración:
server { listen 80;
server_name _;
if ($http_x_forwarded_proto = 'http'){
return 301 https://$host$request_uri;
}
}
-
Reinicia NGINX.
Servidores IIS
Nota: Esta resolución se aplica a Microsoft Windows Server 2012 R2 y 2016 Base.
Sigue estos pasos:
-
Instala el módulo de reescritura de URL de IIS. Para obtener más información, consulta Reescritura de URL en el sitio web de Microsoft.
-
Abre el archivo web.config.
-
Agrega la siguiente regla de reescritura a la sección <system.webServer>. Modifica la regla de reescritura para tu configuración específica:
<rewrite>
<rules>
<rule name="Rewrite HTTP to HTTPS" stopProcessing="true">
<match url="^(.*)$"/>
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$"/>
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}"/>
</rule>
</rules>
</rewrite>
-
Guarda el archivo web.config.
-
Abre el Administrador de IIS.
-
Actualiza el sitio web predeterminado.
-
Comprueba que la nueva regla de reescritura aparezca en la sección Reescritura de URL.
-
Reinicia tu sitio web.
-
Comprueba que el redireccionamiento funciona.
Información relacionada
¿Por qué recibo un error HTTP 5xx al conectarme a servidores web que se ejecutan en instancias de EC2 configuradas para usar un equilibrador de carga clásico?