¿Qué es HSTS?
HSTS significa HTTP Strict Transport Security. Es una sola cabecera de respuesta, Strict-Transport-Security. Le dice al navegador: para este sitio, usa solo HTTPS a partir de ahora.
Cuando el navegador ya vio la cabecera, cambia cada enlace http:// por https:// antes de enviar nada. Además, no deja que el visitante ignore un aviso de certificado. Como resultado, nadie puede devolver en silencio a ese visitante a HTTP.
El hueco que cierra HSTS
La mayoría de los sitios ya redirige de HTTP a HTTPS. Eso está bien, pero deja un hueco. La primera petición sigue saliendo por HTTP simple, y solo entonces el servidor responde con la redirección.
En una wifi pública, esa primera petición es el momento débil. Un atacante en la misma red puede responder antes y mantener al visitante en una copia falsa de tu sitio por HTTP. Este truco se llama SSL stripping.
HSTS elimina ese momento en todas las visitas después de la primera. Como el navegador ya conoce la regla, nunca envía la petición HTTP. Además, desaparece el salto de redirección, así que la página también abre un poco más rápido.
Cómo añadir HSTS en htaccess
Primero, comprueba que todas las páginas funcionan con HTTPS, incluidas imágenes, scripts y los subdominios que usas. Después añade una línea al archivo .htaccess en Apache:
Header always set Strict-Transport-Security "max-age=300" Empieza con un max-age corto de 300 segundos mientras pruebas. Si algo falla, los navegadores olvidan la regla en cinco minutos. En Nginx, la misma línea va en el bloque del servidor HTTPS:
add_header Strict-Transport-Security "max-age=300" always; 
Después, revisa el resultado con nuestro HTTP Header Checker gratuito. Muestra si la cabecera se envía y qué max-age usa.
Cómo subir max-age sin riesgo
HSTS es fácil de activar pero lento de desactivar. El navegador guarda la regla durante todo el max-age, aunque quites la cabecera. Por eso, súbelo por pasos:
- 300 segundos (cinco minutos) mientras pruebas.
- 86400 segundos (un día) cuando nada se haya roto.
- 604800 segundos (una semana) tras unos días tranquilos.
- 31536000 segundos (un año) cuando todas las páginas lleven un tiempo en HTTPS.
Un año es el valor que recomiendan la mayoría de las guías para un sitio en producción. También es el mínimo para la lista de preload.
includeSubDomains y preload
La opción includeSubDomains aplica la regla también a cada subdominio. Añádela solo cuando todos los subdominios funcionen con HTTPS, incluidos los viejos, como una herramienta interna o un panel de correo.
La opción preload va un paso más allá. Los navegadores traen una lista de sitios HSTS, así que incluso la primera visita usa HTTPS. Sin embargo, salir de esa lista tarda meses. Por lo tanto, envía tu dominio en hstspreload.org solo cuando estés seguro.
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" Cómo leer la cabecera HSTS
La cabecera tiene hasta tres partes. Además, cada una es una promesa que haces a cada navegador que te visita.
max-age
Es el número de segundos que el navegador guarda la regla. El temporizador vuelve a empezar en cada visita que envía la cabecera. Por eso un visitante habitual nunca llega realmente al final.
includeSubDomains
Esta opción cubre todos los nombres bajo tu dominio, como shop.example.com y mail.example.com. Por lo tanto, un subdominio olvidado sin HTTPS deja de funcionar para quien haya visto la regla.
preload
Esta opción solo dice que aceptas entrar en la lista integrada de los navegadores. Por sí sola no hace nada. Aun así, tienes que enviar el dominio.
De dónde debe salir la cabecera
Los navegadores solo aceptan la cabecera por una conexión HTTPS válida. También, para preload, el dominio sin www debe enviarla, no solo www.
HSTS en otros servidores y CDN
La idea es igual en todas partes: enviar una cabecera en cada respuesta HTTPS. Así, solo cambia el lugar donde la escribes.
Cloudflare
En el panel de Cloudflare, abre SSL/TLS, luego Edge Certificates, y activa HSTS. Elige ahí el max-age. Como Cloudflare envía la cabecera, no necesitas también una línea en htaccess.
WordPress
Si no puedes editar el servidor, un plugin de seguridad puede añadir la cabecera. Sin embargo, una regla del servidor es más rápida, porque actúa antes de que arranque PHP.
IIS
En servidores Windows, añade una cabecera personalizada llamada Strict-Transport-Security en los encabezados de respuesta HTTP del sitio. Después compruébala con el verificador de cabeceras.
Cómo probar y quitar HSTS
Primero, prueba desde fuera con nuestro HTTP Header Checker. Muestra la cabecera exacta y el max-age que reciben los visitantes.
En Chrome también puedes abrir chrome://net-internals/#hsts y consultar tu dominio. Muestra si el navegador guardó la regla y cuándo termina. En la misma página puedes borrar la regla de tu navegador mientras pruebas.
Para quitar HSTS a todos, envía max-age=0 durante un tiempo en lugar de borrar la cabecera. Así cada navegador que visita olvida la regla. Después, ya puedes quitar la línea.
Errores comunes
- Empezar con un max-age de un año. Si HTTPS falla, los visitantes quedan fuera hasta que pase el año.
- Añadir includeSubDomains cuando un subdominio aún no tiene certificado.
- Enviar la cabecera por HTTP. Los navegadores la ignoran ahí; solo cuenta en HTTPS.
- Olvidar la palabra
always, de modo que las páginas de error salen sin la cabecera. - Enviar el dominio a la lista de preload como prueba.
En resumen, HSTS es una línea, pero max-age es una promesa. Súbelo despacio y revisa cada paso con el HTTP Header Checker. Para ver cada directiva en detalle, consulta la guía de MDN sobre Strict-Transport-Security.
Preguntas y respuestas
¿Qué hace HSTS?
Le dice al navegador que use solo HTTPS para tu sitio durante un tiempo. Después de la primera visita, el navegador nunca envía una petición HTTP a tu sitio.
¿Sigo necesitando la redirección de HTTP a HTTPS con HSTS?
Sí. La redirección cubre la primera visita, antes de que el navegador vea la cabecera. HSTS cubre todas las visitas siguientes.
¿Qué max-age debo usar en HSTS?
Empieza con 300 segundos mientras pruebas y súbelo por pasos. Para un sitio en producción, 31536000 segundos (un año) es el valor final habitual.
¿Cómo quito HSTS?
Envía la cabecera con max-age=0. Los navegadores borran la regla la próxima vez que visiten por HTTPS. Hasta entonces, mantienen la regla vieja.
¿HSTS es bueno para el SEO?
No de forma directa. Sin embargo, quita un salto de redirección a quienes vuelven y los protege, lo que ayuda a la velocidad y la confianza.
¿Por qué no aparece mi cabecera HSTS?
Comprueba que se envía por HTTPS, que el módulo headers de Apache está activo y que una CDN o caché no la elimina. Nuestro HTTP Header Checker muestra lo que llega de verdad.
¿Qué es el preload de HSTS?
Una lista integrada en los navegadores, para que incluso la primera visita use HTTPS. Necesitas max-age de un año, includeSubDomains y preload, y luego envías el dominio en hstspreload.org.
¿HSTS puede dejar fuera a los visitantes?
Sí, si HTTPS falla mientras hay un max-age largo activo. Por eso se empieza corto y solo se sube cuando todo funciona.
¿HSTS hace más lento mi sitio?
No. Quita la redirección de HTTP a HTTPS a quienes vuelven, así que las páginas abren un poco más rápido.
¿Dónde activo HSTS en Cloudflare?
En SSL/TLS, Edge Certificates, en HTTP Strict Transport Security. Entonces no necesitas añadirla también en htaccess.
¿Puedo añadir HSTS con un plugin de WordPress?
Sí, muchos plugins de seguridad pueden enviarla. Aun así, una regla en htaccess o Nginx es más rápida y también cubre archivos que no son de WordPress.
¿Por qué mi cabecera HSTS sale dos veces?
La añaden a la vez el servidor y la CDN o un plugin. Deja una sola fuente, así el max-age queda claro.
¿Cómo veo si Chrome guardó mi regla HSTS?
Abre chrome://net-internals/#hsts y consulta tu dominio. Ahí también puedes borrar la regla de tu navegador.
¿HSTS funciona en localhost?
Los navegadores ignoran HSTS en localhost y en direcciones IP, por eso se prueba en un dominio real.
¿Qué pasa si caduca el certificado con HSTS activo?
Quienes vieron la regla no pueden saltarse el aviso. Por eso la renovación automática del certificado importa aún más con HSTS.
¿HSTS es lo mismo que una redirección 301?
No. La redirección la envía el servidor en cada petición HTTP. En cambio, HSTS hace que el navegador se salte del todo la petición HTTP.
¿Todos los subdominios deben usar HTTPS antes de includeSubDomains?
Sí. Revisa cada subdominio, incluidos los viejos y las herramientas internas, antes de añadir la opción.
¿Cuánto se tarda en entrar en la lista de preload?
Normalmente de unas semanas a unos meses, porque la lista llega con las nuevas versiones del navegador.
¿HSTS protege contra todos los ataques?
No. Frena el paso a HTTP simple. Aun así necesitas otras cabeceras, como una Content-Security-Policy, para otros riesgos.
¿El SEO Checker revisa HSTS?
Sí. Nuestro SEO Checker muestra si se envía la cabecera y enlaza a esta guía cuando falta.