// Engineering Log
HTTP, HTTPS y TLS: Parte 7 — Transición a HTTPS: redirecciones, HSTS, HTTPS-First y el encabezado Upgrade
Publicado el 09.10.2026
// Ruta rapida
Este articulo pertenece al tema Servidores e infraestructura.
El usuario escribe en la barra de direcciones example.ru sin esquema, sigue un enlace antiguo http://… o abre un marcador de hace una década. En todos estos casos la primera petición puede ir por HTTP sin cifrar, y la tarea del propietario del sitio es que luego todo vaya por HTTPS, y en lo ideal — que no haya petición abierta en absoluto. Para ello existen varios mecanismos que actúan en diferentes etapas: redirección en el servidor, HSTS, la lista integrada preload, el modo HTTPS-First en el navegador, registro DNS de tipo HTTPS. Separadamente se analiza el encabezado Upgrade, con el que a menudo se confunde la «actualización a HTTPS»: él cambia el protocolo por otro, por ejemplo WebSocket.
Redirección de HTTP a HTTPS
Nivel básico — el servidor en el puerto 80 responde con una redirección a la misma dirección por HTTPS:
server {
listen 80;
listen [::]:80;
server_name example.ru www.example.ru;
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt; # comprobación Let's Encrypt HTTP-01
}
location / {
return 301 https://$host$request_uri;
}
}Lo que importa:
- 301 o 308. Ambos son redirecciones permanentes; los motores de búsqueda transfieren el peso de la página a la nueva dirección. 308 preserva el método y el cuerpo de la petición; con 301 el navegador convierte POST en GET. Para un sitio la diferencia suele ser inapreciable, para una API donde los clientes envían por error POST a
http://es mejor 308. - Conservar la ruta.
$request_uricontiene la ruta y los parámetros. Redirigir todas las páginas a la página principal rompe enlaces y los resultados de búsqueda. - Un solo paso. La cadena
http://example.ru→https://example.ru→https://www.example.ruson dos vueltas innecesarias. Dirija directamente a la dirección final. - Let’s Encrypt HTTP-01 sigue las redirecciones, por lo que un
locationseparado paraacme-challengeno es obligatorio, pero evita sorpresas con configuraciones no estándar.
El punto débil de la redirección: la primera petición sigue siendo abierta. Un atacante en la misma red (por ejemplo, en Wi-Fi público) puede interceptarla y no dejar que el usuario llegue a HTTPS, sirviéndole el sitio por HTTP a través de sí mismo. Esta técnica se llama SSL stripping, y HSTS protege contra ella.
HSTS
HSTS (HTTP Strict Transport Security, RFC 6797) es un encabezado de respuesta con el que el sitio le dice al navegador: «durante el tiempo indicado, comunícate conmigo solo por HTTPS».
Strict-Transport-Security: max-age=31536000; includeSubDomainsmax-age— tiempo en segundos (31536000 = un año). Cada respuesta con el encabezado renueva el periodo;includeSubDomains— la regla se aplica a todos los subdominios;preload— consentimiento para la inclusión en la lista preload (más abajo).
Al recibir el encabezado, el navegador:
- reescribe por sí mismo cualquier enlace
http://a ese sitio enhttps://antes de enviar la petición — la redirección del servidor deja de ser necesaria (en las herramientas de desarrollador se ve como307 Internal Redirect); - no permite al usuario omitir un error de certificado: no hay botón «Continuar de todos modos».
Reglas:
- el navegador acepta el encabezado solo por HTTPS; en la respuesta por HTTP lo ignora;
- empiece con un
max-agepequeño (300, luego 86400, luego una semana) e increméntelo cuando esté seguro de que todo funciona por HTTPS. No se puede cancelar HSTS rápidamente: los navegadores que hayan memorizado el encabezado exigirán HTTPS hasta el fin del periodo; - verifique
includeSubDomainscon especial cuidado: si tieneintranet.example.ruoprinter.example.rusin HTTPS, después de activarlo dejarán de abrirse para todos los que visitaron el dominio principal.
En Nginx:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;Lista HSTS preload
HSTS empieza a actuar después de la primera visita por HTTPS. La primera visita queda sin protección. Para cubrir también esa primera visita existe la lista preload — un listado de dominios incorporado en Chrome, Firefox, Safari y Edge. Para los dominios de la lista el navegador usa solo HTTPS desde la primera petición.
Requisitos para la inclusión (hstspreload.org):
- certificado válido;
- redirección de HTTP a HTTPS en el mismo nombre de host;
- todos los subdominios accesibles por HTTPS;
- encabezado en el dominio principal:
max-ageno menor de 31536000,includeSubDomainsypreload.
Se puede solicitar en hstspreload.org; entrar en las versiones estables de los navegadores lleva semanas. El borrado de la lista lleva meses y no afecta a versiones antiguas de navegadores, por lo que preload es en la práctica irreversible. Algunas zonas de dominio están incluidas por completo: todos los sitios en .dev, .app, .page funcionan solo por HTTPS.
HTTPS-First en los navegadores
Los navegadores no esperan a que el sitio configure HSTS, y por sí mismos prueban HTTPS.
- Chrome desde la versión 115 (2023) al acceder a
http://primero intenta HTTPS y, si falla, vuelve a HTTP (HTTPS-Upgrades). La opción «Siempre usar conexiones seguras» (Always Use Secure Connections) además advierte antes de abrir el sitio por HTTP. Google anunció que en Chrome 154 (octubre de 2026) esta opción estará activada por defecto: el navegador preguntará al usuario antes de la primera visita a un sitio público sin HTTPS y no repetirá la advertencia para sitios que el usuario visite con regularidad. Para usuarios con el modo reforzado Safe Browsing está activada desde abril de 2026. - Firefox desde la versión 136 (marzo de 2025) funciona en modo HTTPS-First por defecto: intenta HTTPS y retrocede a HTTP si el sitio no responde. Hay además un modo más estricto HTTPS-Only.
- Safari también intenta HTTPS para direcciones sin esquema.
Qué significa esto para el propietario del sitio: si por HTTPS en su dominio se abre algo distinto que por HTTP (plantilla del hosting, sitio ajeno en la misma IP, error de certificado), los usuarios cada vez más verán precisamente eso. HTTPS debe funcionar en todos los nombres que usted publique, y los sitios sin HTTPS irán acompañados de una advertencia.
Upgrade-Insecure-Requests y contenido mixto
Contenido mixto — una página por HTTPS que carga scripts, estilos o imágenes por HTTP. Los navegadores bloquean esos scripts, estilos y frames; las imágenes, vídeos y audios intentan cargarse por HTTPS y si no es posible no se muestran.
Dos cosas con nombres parecidos:
Encabezado de petición
Upgrade-Insecure-Requests: 1. El navegador lo envía al acceder a una página, indicando: «prefiero HTTPS». El servidor puede responder a él con una redirección a HTTPS. En la práctica con una redirección normal suele ser suficiente; este encabezado se usa raramente.Directiva CSP
upgrade-insecure-requests. Encabezado de respuesta que ordena al navegador reescribir todos los recursoshttp://en la página ahttps://antes de cargarlos:Content-Security-Policy: upgrade-insecure-requestsÚtil al migrar un sitio antiguo con miles de enlaces a imágenes
http://: mientras no se corrijan los enlaces, la directiva elimina las advertencias. Los recursos deben estar disponibles por HTTPS — la directiva no crea HTTPS donde no existe.
Registro DNS HTTPS
Un registro tipo HTTPS (RFC 9460) informa al cliente de parámetros de conexión antes de la primera petición:
example.ru. 3600 IN HTTPS 1 . alpn="h3,h2" ipv4hint=192.0.2.10- la mera presencia del registro le indica al navegador que el sitio está disponible por HTTPS: Chrome y Firefox en ese caso van directamente a
https://, evitando el HTTP abierto, igual que con HSTS; alpn— qué protocolos se soportan; conh3el navegador puede conectar directamente por HTTP/3;ech— clave para Encrypted Client Hello;ipv4hint,ipv6hint— direcciones para no esperar la respuesta a A/AAAA.
Cloudflare soporta el registro (lo crea automáticamente) y algunos hostings DNS también. Comprobarlo: dig HTTPS example.ru.
Encabezado Upgrade: cambio de protocolo
Upgrade es un mecanismo de HTTP/1.1 para pasar de HTTP a otro protocolo dentro de la misma conexión TCP. El cliente propone, el servidor acepta con 101 Switching Protocols, y a partir de ahí por la conexión va el nuevo protocolo.
WebSocket (RFC 6455) es el ejemplo principal. En qué se diferencia WebSocket de SSE y long polling y cuándo elegir cada uno está en el artículo «WebSockets, Long Polling y SSE». Aquí — cómo se ve la propia transición:
GET /ws HTTP/1.1
Host: example.ru
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=La dirección wss:// es WebSocket sobre TLS, es decir, primero se establece HTTPS y dentro de él se hace el Upgrade.
Upgrade y Connection son encabezados de una misma etapa, y los proxies no los reenvían más allá. Por eso para WebSocket detrás de Nginx se necesita una configuración explícita:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
location /ws/ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 3600s; # por defecto 60 s — la conexión inactiva se cerrará
}
}Sin estas líneas el cliente recibirá 400 o 426, y en el registro de la aplicación habrá un GET normal sin Upgrade.
En HTTP/2 y HTTP/3 no existe el encabezado Upgrade. WebSocket en ellos se abre mediante el método extendido CONNECT (RFC 8441 para HTTP/2, RFC 9220 para HTTP/3) con el pseudocabecero :protocol: websocket. Navegadores y servidores lo negocian entre sí; Nginx sigue comunicándose con la aplicación por HTTP/1.1.
Otras aplicaciones de Upgrade:
Upgrade: h2c— pasar a HTTP/2 sin cifrar. Los navegadores nunca lo soportaron, y el RFC 9113 (2022) lo declaró obsoleto. Los proxies que permiten pasarUpgrade: h2ca la aplicación a veces permiten eludir sus reglas de acceso (h2c smuggling) — es mejor descartar esos encabezados en la entrada;Upgrade: TLS/1.0— pasar a TLS dentro de la conexión HTTP (RFC 2817). No se adoptó en la web; en su lugar se usa el puerto separado 443.
Si el servidor requiere cambiar a otro protocolo responde con el código 426 Upgrade Required y el encabezado Upgrade indicando el protocolo necesario.
Orden para migrar el sitio a HTTPS
- Emitir certificado para todos los nombres usados, incluyendo
www, y configurar renovación automática. - Verificar que el sitio funciona completamente por HTTPS: enlaces internos, imágenes, formularios, widgets de terceros. Para enlaces antiguos en el contenido — CSP
upgrade-insecure-requests. - Habilitar redirección 301 de HTTP a HTTPS, conservando la ruta.
- Indicar
https://en las direcciones canónicas, el mapa del sitio, en Yandex Webmaster y Google Search Console. - Activar HSTS con
max-agecorto; tras unas semanas — un año yincludeSubDomains. - Si está seguro de todos los subdominios — enviar el dominio a la lista preload.
Errores típicos
- Redirección infinita: la aplicación detrás del proxy no ve
X-Forwarded-Proto: httpsy vuelve a redirigir a HTTPS; lo mismo ocurre con Cloudflare en modo Flexible. - HSTS con
includeSubDomainsen el dominio principal cuando hay subdominios sin HTTPS — los servicios internos dejan de abrirse. - El encabezado HSTS se entrega por HTTP — el navegador lo ignora, no hay protección.
- Redirigir a la página principal en vez de a la misma página.
- WebSocket detrás de Nginx sin
proxy_http_version 1.1y sin los encabezadosUpgrade/Connection, o conproxy_read_timeoutpor defecto — las conexiones se cortan cada minuto.
// Tarea parecida
Si estas resolviendo algo parecido
Este articulo pertenece a uno de los temas principales de trabajo. Puedes seguir leyendo sobre el tema, ir a la pagina principal para entender a que me dedico o abrir directamente los servicios.
Tema del articulo
Servidores e infraestructura
VPS, Linux, stack web, migraciones, hosting, bases de datos y operacion base.
Tareas frecuentes de esta tema
- Migrar un sitio o servicio a un nuevo servidor
- Configurar Linux, Nginx, base de datos y copias de seguridad
- Entender por que el sistema funciona de forma inestable
// Siguiente paso
Si necesitas ayuda con este tema y no solo otro articulo, es mejor ir directo a la pagina del servicio. La pagina principal y la seleccion de materiales quedan como rutas secundarias.
Abrir servicios// Reviews
Reseñas relacionadas
Gracias a Mijaíl por su disposición. Hablamos por teléfono; me explicó cómo hacerlo yo mismo. Es la segunda vez que recurro a él: todo genial y muy rápido.
Gracias a Михаил por su amabilidad. Hablamos por teléfono, me explicó cómo hacerlo por mi cuenta. Es la segunda vez que recurro, todo genial y rápido.
Quiero expresar mi enorme agradecimiento al especialista que me configuró las URLs amigables en OpenCart. Fue fácil y sencillo, y me alegra haber encontrado finalmente a un profesional que lo hizo todo con calidad y sin complicaciones. Antes cambié a cuatro especialistas y cada vez surgían problemas con la configuración, pero esta persona resolvió la tarea a la perfección.
Quiero expresar mi enorme agradecimiento al especialista que me configuró las URLs amigables en OpenCart. Configurar las URLs amigables resultó fácil y sencillo, y me alegra haber finalmente encontrado a un profesional …
Excelente trabajo, no es la primera vez que recurro; encuentra soluciones a problemas complejos. Lo recomiendo.
Excelente trabajo, recurro no por primera vez, encuentra soluciones a problemas complejos. Recomiendo.
¡Excelente trabajo! Cumplió con la tarea a tiempo y sin errores. Fue un placer colaborar, lo recomiendo.
¡Excelente trabajo! Completó la tarea encomendada a tiempo y sin errores. Fue un placer colaborar, lo recomiendo.
Excelente especialista, se adentró en el problema, lo entendió y lo solucionó. Lo recomiendo.
Excelente especialista, se involucró en el problema, lo entendió y lo solucionó. Recomiendo.
Corrección de la expresión regular en location de nginx
21.03.2024 · ★ 5/5
Había que resolver un problema con el certificado SSL en el servidor, que había sido emitido mediante Ngnix Proxy manager. Mijaíl aclaró todos los detalles de cómo tengo todo configurado, pidió accesos para evaluar la viabilidad de la solución, ya que antes no se había enfrentado a un servicio similar. Se familiarizó rápidamente y resolvió mi problema. Colaboración perfecta)
Necesitaba resolver un problema con el certificado SSL en el servidor, que fue emitido a través de Ngnix Proxy manager. Mikhail aclaró todos los detalles sobre cómo tengo todo organizado, pidió accesos para evaluar la …
Diagnóstico de Nginx Proxy Manager en un contenedor Docker y solución del problema
15.03.2024 · ★ 5/5
// Contact
¿Necesitas ayuda?
Escríbeme y te ayudaré a resolver el problema
Respondo en un día laborable (03:00-13:00 GMT)
Или оставьте заявку здесь:
// Related