Cómo funciona esta comprobación
Scanaris pide tu página por http://, sin la ese, sin seguir redirecciones, y mira qué responde el servidor. Si devuelve un código de redirección (301, 302, 307 u 308) hacia una URL https://, todo correcto. Si responde 200 y sirve la página en claro, abre un hallazgo de severidad media: la versión sin cifrar de tu web existe y funciona. Si redirige pero el destino sigue siendo http:// (por ejemplo, de la raíz a http://www), abre uno de severidad baja: la cadena de redirecciones tiene un eslabón sin cifrar. Solo se prueba la URL escaneada; conviene que el comportamiento sea el mismo en todas las rutas, no solo en la portada.
Por qué importa
Mientras exista una versión HTTP que responde, cualquier enlace antiguo, cualquier dirección escrita a mano y cualquier red pública pueden llevar al usuario a tu web sin cifrado. En ese estado, quien controla la red (el wifi del aeropuerto, un proveedor malicioso) lee lo que se envía y puede modificar la página antes de que llegue. Es la base de los ataques de intermediario. Un 301 a HTTPS cierra esa puerta en la primera petición, y el HSTS la cierra para todas las siguientes.
Cómo arreglarlo según tu hosting
- Vercel, Netlify, Cloudflare Pages, Railway, Render: la redirección viene activada. Si ves el hallazgo, normalmente el dominio está apuntando a otro servidor o hay un proxy delante que responde por HTTP.
- Cloudflare como proxy: activa "Always Use HTTPS" y pon el modo SSL en "Full (strict)". Con "Flexible", el tramo entre Cloudflare y tu servidor va sin cifrar.
- nginx:
server {
listen 80;
server_name tudominio.com www.tudominio.com;
return 301 https://$host$request_uri;
}
- Apache: en el VirtualHost del puerto 80,
Redirect permanent / https://tudominio.com/. - Express detrás de un proxy: un middleware que compruebe
req.headers['x-forwarded-proto'] !== 'https'y responda conres.redirect(301, 'https://' + req.headers.host + req.url), conapp.set('trust proxy', 1).
Usa un 301 o un 308 (permanentes) y no un 302: los buscadores consolidan la autoridad en la versión HTTPS y los navegadores cachean el salto. Después añade la cabecera HSTS, que mide el check de HSTS débil, para que el navegador ni siquiera intente HTTP la próxima vez.
Comprueba que está arreglado
curl -sI http://tudominio.com | grep -iE "^HTTP|^location"
curl -sI http://tudominio.com/una-pagina-cualquiera | grep -iE "^HTTP|^location"
curl -sI http://www.tudominio.com | grep -iE "^HTTP|^location"
Las tres deben responder 301 o 308 con un Location que empiece por https://. Si la segunda no redirige, tu regla solo cubre la portada.
Preguntas frecuentes
¿No basta con tener HTTPS activado?
No. Tener certificado significa que la versión segura existe; la redirección significa que la insegura no se usa. Sin ella, las dos conviven.
¿Por qué 301 y no 302?
El 302 es temporal: los navegadores vuelven a pedir la versión HTTP cada vez y los buscadores no transfieren la autoridad. El 301 (o el 308, que además conserva el método) es la señal de que el cambio es definitivo.
Mi API no necesita HTTPS, solo la usa mi app.
Sí lo necesita: por esa API viajan tokens y datos de tus usuarios. Y si la app la llama por HTTP desde una página HTTPS, el navegador la bloquea como contenido mixto.