HSTS y doble redirección

HSTS y doble redirección

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

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

Error: HTTP redirige a www primero

http://example(HTTP) debería redirigir 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 redireccionamos 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í el error "la página no se redirige correctamente" en el 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?

Respuesta1

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

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

Necesitas redirigir almismo anfitrión(es decir, HTTP_HOST), no simplemente a example.comla primera. No es necesario redirigir a example.comsi el usuario realiza la solicitud www.example.comdirectamente. (La prueba implicará una solicitud a example.com.) Después de eso, puede redirigir al subdominio www canónico 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 la solicitud HTTP (es decir, cualquier host que se solicite).

El segundo redireccionamiento indica... para todas las solicitudes en las que el host solicitado no se inicia, www.luego prefije www.el 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 estas son redirecciones 302 (temporales). Cambie a 301 solo cuando esté seguro de que funciona bien.

Y: ¿hay algún riesgo?

Sin riesgos. Sí, potencialmente hay dos redireccionamientos, mientras que antes solo podía haber uno (lo que podría decirse que es menos eficiente). Pero todavía hay sólo 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 habría sido completo por sí solo, ya que no canonicaliza una solicitud para https://example.com/...(es decir, HTTPS y ápice de dominio).


Otras lecturas:

información relacionada