HSTS y doble redireccionamiento

9

Administro un pequeño sitio web en un entorno de alojamiento compartido LAMP: esto básicamente significa que lo único que puedo editar es un archivo htaccess.

Quería agregar soporte HSTS (y lo hice), pero, cuando probé mi sitio web aquí para la elegibilidad de precarga de HSTS, recibí el siguiente error:

Error: HTTP redirige a www primero

http://example(HTTP) debe redirigirse inmediatamente a https://example(HTTPS) antes de agregar el subdominio www. En este momento, la primera redirección es a https://www.example.La redirección adicional es necesaria para garantizar que cualquier navegador que admita HSTS registre la entrada HSTS para el dominio de nivel superior, no solo el subdominio.

Entonces, supongo que debería redirigir a los usuarios de esta manera:

  1. http://example (esto es lo que el usuario ingresa en la barra de direcciones de su navegador)
  2. https://example (lo redirigimos a la versión HTTPS del sitio web)
  3. https://www.example (lo redirigimos nuevamente al subdominio www)

Mi redirección actual se realiza de esta manera:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Intenté agregar una redirección antes de la última línea, de esta manera:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

pero recibí un error "la página no está redirigiendo correctamente" del navegador.

Entonces, ¿cuál es la forma correcta de redirigir a un usuario desde la versión http del sitio web a https y finalmente a https con www? Y: ¿hay algún riesgo?

HBruijn
fuente

Respuestas:

10

Como se señala en los requisitos de envío de la lista de precarga de HSTS :

  1. Redireccionar de HTTP a HTTPS en el mismo host, si está escuchando en el puerto 80.

Debe redirigir al mismo host (es decir HTTP_HOST), no simplemente al example.comprimero. No necesita redirigir a example.comsi el usuario lo solicita www.example.comdirectamente. (La prueba implicará una solicitud para example.com). Después de eso, puede redirigir al subdominio canónico www si es necesario.

Intenté agregar una redirección antes de la última línea, de esta manera:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

Eso crearía un bucle de redireccionamiento, porque la RewriteConddirectiva anterior solo se aplica a la primera RewriteRule, por lo que la segunda RewriteRulese ejecutaría incondicionalmente.

Pruebe algo como lo siguiente en su lugar:

# HTTP to HTTPS redirect
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

# Canonical www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]

La HTTP_HOSTvariable del servidor contiene el valor del Hostencabezado de solicitud HTTP (es decir, cualquier host que se solicite).

El segundo estado de redireccionamiento ... para todas las solicitudes donde el host solicitado no se inicia www., prefije www.al host. Sin embargo, esto podría no ser aceptable si tiene varios subdominios (que se resuelven en el mismo lugar) que desea mantener separados, ya que naturalmente serán redirigidos al subdominio www.

Tenga en cuenta que estos son redireccionamientos 302 (temporales). Cambie a 301 solo cuando esté seguro de que está funcionando bien.

Y: ¿hay algún riesgo?

Sin riesgos Sí, hay potencialmente dos redireccionamientos, mientras que anteriormente solo podía haber uno (lo que podría decirse que es menos eficiente). Pero todavía hay solo dos redireccionamientos, lo cual está perfectamente bien para SEO. Además, con HSTS, el agente de usuario solo experimentará la doble redirección como máximo una vez.


RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Aparte: (Ignorando HSTS por el momento ...) Esto no se habría completado por sí solo, ya que no canoniza una solicitud https://example.com/...(es decir, HTTPS y vértice de dominio).


Otras lecturas:

Señor White
fuente
Muchas gracias, lo probaré pronto. Una respuesta rápida al Aside final: ese funciona de todos modos, pero parece que es algo que no puedo controlar directamente (no en el archivo htaccess, al menos: hay un panel de redireccionamiento en el administrador del sitio web del proveedor de alojamiento)
1
Por cierto, su solución funciona PERFECTAMENTE! :-)
1
"panel de redireccionamiento en el administrador del sitio web del proveedor de alojamiento": siempre desconfiaría de tales herramientas. Por ejemplo, la sección de redireccionamientos en cPanel es muy limitada y bastante notoria.
MrWhite
1
Esto depende de cómo esté configurando el Strict-Transport-Securityencabezado de respuesta. Por ejemplo, para configurar esto en la redirección, deberá usar el alwaysargumento de la Headerdirectiva. Respondí una pregunta relacionada en la pila Pro Webmasters (omita la primera parte de mi respuesta sobre on/ off) que entra en más detalles sobre la implementación de la " precarga HSTS " en .htaccess.
MrWhite
1
De nada. Para ser honesto, la pila Pro Webmasters probablemente sea más adecuada para .htaccesspreguntas relacionadas únicamente (ServerFault asume que tienes el control total del servidor, en cuyo caso no estarías haciendo esto .htaccess). Podría decirse que es más fácil implementar esto en la configuración del servidor utilizando <VirtualHost>contenedores separados (ya que no necesita meterse con entornos y condiciones adicionales , es "más limpio" y menos propenso a errores). No creo que recomendaría el envío de la "lista de precarga" si solo tiene acceso .htaccess. (Mi 2c)
MrWhite