Contenido mixto

Qué es el contenido mixto, por qué se bloquea el activo mientras el pasivo genera avisos y cómo detectar y corregir subrecursos inseguros a escala con la consola, informes CSP y cabeceras de seguridad.

Publicado por primera vez: 3 jul 2026 · Última actualización: 22 ago 2026 · Avanzado
Idiomas

El contenido mixto aparece cuando una página https:// carga un subrecurso mediante http://. La taxonomía actual distingue entre contenido actualizable y bloqueable; la división histórica entre activo y pasivo sigue describiendo la mayoría de los tipos, con excepciones como imágenes con CORS, srcset/picture y hosts con dirección IP. El contenido activo —scripts, hojas de estilo, iframes y XMLHttpRequest/fetch— se bloquea porque puede reescribir la página; por eso debe corregirse primero tras migrar a HTTPS. Detecta el problema en el código obtenido, el estado renderizado y sesiones reales mediante rastreo, DevTools e informes CSP. Confirma que el equivalente HTTPS funciona antes de cambiar referencias. Content-Security-Policy: upgrade-insecure-requests reescribe los subrecursos HTTP incluidos en su ámbito, incluso entre orígenes, sin fallback a HTTP; es una red de seguridad, no sustituye la limpieza de la fuente ni HSTS. Bases de datos de CMS, plugins, temas, service workers, cachés y etiquetas de terceros suelen reintroducirlo, así que la auditoría debe ser periódica.

TL;DR — El contenido mixto es una página HTTPS que carga un subrecurso mediante HTTP. La taxonomía actual distingue entre contenido actualizable y bloqueable; la división anterior entre activo y pasivo, usada aquí para describir el radio de impacto, coincide en la mayoría de los tipos, con excepciones: imágenes con CORS, candidatos srcset/picture y hosts con dirección IP son bloqueables aunque un img src normal sea actualizable. Lo activo —scripts, hojas de estilo, iframes, XMLHttpRequest/fetch y todo lo que ejecuta el navegador— se bloquea porque puede reescribir la página, así que debe corregirse primero. Lo pasivo —imágenes, audio y vídeo— antes se cargaba degradando el indicador y ahora se actualiza o bloquea cada vez más. Enlaces y otras navegaciones HTTP superiores no son contenido mixto; tampoco las descargas inseguras, un límite relacionado pero separado. Diagnostica fuente obtenida, estado renderizado/en ejecución y sesiones reales mediante rastreo, Chrome DevTools —cuyo texto depende de navegador/versión— e infracciones Content-Security-Policy-Report-Only. Comprueba que el equivalente HTTPS funciona antes de apuntar cada subrecurso a https://; usa rutas relativas solo tras verificar propiedad y URL base. Content-Security-Policy: upgrade-insecure-requests reescribe solicitudes http:// incluidas en su ámbito, también entre orígenes, como https:// antes de enviarlas y de las comprobaciones CSP. No tiene fallback, no sustituye corregir la fuente, no actualiza navegación superior a terceros y no reemplaza HSTS. La propia directiva en report-only no hace nada. Haz copia y simulación al sustituir en bases de CMS, pues una operación ingenua corrompe datos serializados; audita también plugins, temas, service workers/cachés y etiquetas de terceros.

El hub de HTTPS presenta el contenido mixto como uno de los dos fallos de lanzamiento de una migración, junto con las redirecciones. Este análisis cubre niveles de recursos, detección, CSP y las causas operativas de recurrencia.

Qué se considera contenido mixto y qué no

El alcance es preciso: trata de los subrecursos que carga la página, no de los enlaces que contiene. Google: “A page has mixed content when its initial HTML is loaded over a secure HTTPS connection, but other resources (such as images, videos, stylesheets, and scripts) are loaded over an insecure HTTP connection.” (traducción) «Una página tiene contenido mixto cuando su HTML inicial se carga mediante una conexión HTTPS segura, pero otros recursos se cargan mediante una conexión HTTP insegura». Evidence for this claim Mixed content occurs when a secure page loads resources over insecure HTTP, and browsers upgrade or block mixed-content requests by resource type. Scope: MDN documents current browser categories and behavior; individual browser versions may differ at the margins. Confidence: high · Verified: MDN: Mixed content

La trampa es la etiqueta de enlace. Un <a href="http://…"> a una página HTTP no es contenido mixto: navega a un documento nuevo, no carga un recurso inseguro en el actual. Lo mismo vale para cualquier navegación de nivel superior a HTTP.

Aun así, conviene dirigir enlaces salientes a HTTPS. Con la Referrer-Policy predeterminada moderna (strict-origin-when-cross-origin), un clic de HTTPS a HTTP elimina Referer, lo que puede distorsionar la analítica. Pero ese comportamiento depende de la política y el navegador: una página o CDN que defina una Referrer-Policy menos estricta puede enviarlo. Comprueba la Referrer-Policy aplicada antes de afirmar cuánto se pierde; es un problema distinto del contenido mixto.

Activo frente a pasivo: la distinción que fija prioridades

La documentación moderna clasifica el contenido como actualizable o bloqueable, no con la división histórica activo/pasivo. Esta sigue siendo útil para explicar por qué se traza la línea y Google la utiliza, pero consulta las excepciones al razonar sobre tipos concretos.

Google dice: “Active mixed content poses a greater threat than passive mixed content.” (traducción) «El contenido mixto activo supone una amenaza mayor que el pasivo». Esa frase determina el triaje.

El contenido mixto activo puede tomar toda la página. Google lo describe como “scripts, stylesheets, iframes, and any other code the browser can download and execute.” (traducción) «scripts, hojas de estilo, iframes y cualquier código que el navegador pueda descargar y ejecutar». La lista práctica incluye:

  • <script src="http://…">: un script interceptado puede reescribir el DOM, extraer formularios o inyectar contenido.
  • <link rel="stylesheet" href="http://…">: CSS puede ocultar, recolocar o superponer elementos.
  • <iframe src="http://…">: documento inseguro incrustado en uno seguro.
  • XMLHttpRequest / fetch() a http://: datos inseguros sobre los que actúa la página.
  • Fuentes web, <object>/<embed> y variantes de <link> con contenido ejecutable o que controla el diseño.

Como puede reescribir la página, “Most browsers already block this type of content by default to protect users.” (traducción) «La mayoría de los navegadores ya bloquean este tipo de contenido de forma predeterminada para proteger a los usuarios». Por eso rompe visiblemente una migración: una hoja bloqueada elimina CSS, un script mata la interactividad y un iframe deja un hueco. Corrige primero el activo. Es un fallo funcional.

El contenido pasivo“including images, video, and audio” (traducción) «incluidas imágenes, vídeo y audio»— “doesn’t interact with the rest of the page.” (traducción) «no interactúa con el resto de la página». Una imagen interceptada puede sustituirse, pero no tomar el documento. Históricamente se cargaba degradando el indicador: “Until recently, passive mixed content was loaded in all browsers, because blocking it would have broken many websites. This is now beginning to change.” (traducción) «Hasta hace poco se cargaba en todos los navegadores, porque bloquearlo habría roto muchos sitios. Esto empieza a cambiar». Ahora se actualiza automáticamente cuando es posible y se bloquea en caso contrario.

Excepciones que no refleja la división activo/pasivo

La línea actualizable/bloqueable presenta excepciones importantes:

  • Las imágenes con CORS fallan, no se actualizan. Un <img src="http://…"> normal es actualizable; con crossorigin, el algoritmo fuerza el fallo.
  • srcset y <picture> son bloqueables. La misma imagen mediante un mecanismo adaptable no se comporta como un src simple.
  • Los hosts con dirección IP se bloquean, incluso en tipos actualizables. http://203.0.113.5/logo.png no recibe el tratamiento de un dominio.
  • Contextos anidados y workers están incluidos. Las comprobaciones se aplican en iframes y service/shared workers.
  • Orígenes locales y loopback tienen matices. localhost, loopback y file:// son «potencialmente fiables» incluso sin TLS; la heurística HTTP/HTTPS no encaja limpiamente en desarrollo.
  • Las descargas inseguras son un límite separado. Una descarga mediante http:// entraña riesgo, pero se rige por la seguridad de descargas, no por estas reglas de subrecursos.
  • La navegación HTTP superior no es contenido mixto, incluido el enlace anterior.

Detectar contenido mixto en toda la pila

No existe un botón único. Diagnostica por separado la fuente obtenida, el estado renderizado/en ejecución y las sesiones reales detrás de consentimiento, georredirección, login o etiquetas condicionales:

  1. Consola de Chrome DevTools. El contenido activo bloqueado registra algo parecido a “Mixed Content: The page … was loaded over HTTPS, but requested an insecure … This request has been blocked; the content must be served over HTTPS.” (traducción) «Contenido mixto: la página … se cargó mediante HTTPS, pero solicitó un recurso inseguro… La solicitud se bloqueó; el contenido debe servirse mediante HTTPS». Lo pasivo genera una advertencia. Security/Issues lo agrupa por página. El texto, el panel y los tipos bloqueados dependen del navegador y versión; se comprobó con Chrome en 2026-07, así que verifica el entorno real y espera diferencias en Firefox, Safari y Edge.

  2. Rastreador de sitios. Ahrefs Site Audit y Screaming Frog señalan a escala páginas HTTPS con subrecursos http://. Es la herramienta principal, pero lee la fuente: un rastreo limpio no demuestra que el renderizado o una sesión real lo estén. Registra herramienta y versión.

  3. Informes de infracciones CSP. Los navegadores de visitantes detectan recursos condicionados y terceros. La fuente oficial explica: “You can use content security policy to collect reports of mixed content on your site. To enable this feature, set the Content-Security-Policy-Report-Only directive by adding it as a response header for your site.” (traducción) «La política de seguridad de contenido permite recopilar informes de contenido mixto en el sitio; para activar la función, configura Content-Security-Policy-Report-Only como cabecera de respuesta». El modo de solo informe comunica las infracciones sin aplicar la política. El mecanismo moderno usa report-to / Reporting-Endpoints; el anterior, report-uri. No confundas esta política general de solo informe con upgrade-insecure-requests en ese modo, porque la actualización no funciona.

Evidence for this claim upgrade-insecure-requests in a Content-Security-Policy-Report-Only header is ignored. Scope: Content Security Policy upgrade-insecure-requests processing Confidence: high · Verified: Upgrade Insecure Requests

Usa las tres: DevTools para una página renderizada, rastreo para la fuente de todo el sitio y CSP para la larga cola de sesiones reales. Un rastreo aprobado no garantiza cada estado de consentimiento, variante publicitaria, personalización o worker.

Corregirlo en la fuente

Antes de tocar una referencia, comprueba que el equivalente HTTPS existe, tiene certificado válido y devuelve el contenido esperado. Después, haz que cada subrecurso resuelva mediante HTTPS:

  • URL HTTPS absolutas: cambia http://cdn.example.com/app.js por https://cdn.example.com/app.js. Es la opción explícita y segura por defecto.
  • Rutas relativas o a la raíz: /assets/app.js hereda el esquema. Google: “Make sure intrasite URLs and external URLs don’t depend on a specific protocol. Use relative paths or leave out the protocol as in //example.com/something.js.” (traducción) «Asegúrate de que las URL internas y externas no dependan de un protocolo concreto; usa rutas relativas u omite el protocolo, como //example.com/something.js». Es condicional: confirma que posees el recurso, que la URL base real —incluidos <base>, proxies y contextos incrustados— resuelve como esperas y que nada reconstruye http://, por ejemplo código basado en window.location.
  • URL relativas al protocolo (//example.com/something.js) funcionan, pero no son la solución universal. Requieren las mismas comprobaciones; https:// suele ser más claro.

A escala no edites plantillas una por una, pero tampoco ejecutes una sustitución de cadenas sin protección. http://yourdomainhttps://yourdomain suele funcionar en texto simple; en arrays PHP serializados, blobs JSON o datos de bloques puede corromper registros. Usa herramientas que entiendan el formato, haz copia de seguridad y una simulación. Después corrige plantillas/configuración y usa rastreo/CSP para los restos.

upgrade-insecure-requests: red de seguridad y límites

web.dev: “The upgrade-insecure-requests CSP directive instructs the browser to upgrade insecure URLs before making network requests.” (traducción) «La directiva CSP upgrade-insecure-requests indica al navegador que actualice URL inseguras antes de realizar solicitudes de red». Define esta cabecera:

Content-Security-Policy: upgrade-insecure-requests

MDN dice que “instructs user agents to treat all of a site’s insecure URLs (those served over HTTP) as though they have been replaced with secure URLs (those served over HTTPS).” (traducción) «indica a los agentes que traten todas las URL inseguras del sitio como si se hubieran sustituido por URL seguras». Actualiza “requests to load resources (such as images, scripts, or fonts),” (traducción) «solicitudes para cargar recursos como imágenes, scripts o fuentes», “navigation requests (such as link targets) which are same-origin with the document,” (traducción) «navegación del mismo origen», “navigation requests in nested browsing contexts, such as iframes,” (traducción) «navegación en contextos anidados como iframes», y “form submissions.” (traducción) «envíos de formularios». Evidence for this claim The upgrade-insecure-requests CSP directive rewrites insecure URLs as secure URLs before requests are made. Scope: MDN documents the directive's rewriting behavior and limits; it does not guarantee that an HTTPS version of every resource exists. Confidence: high · Verified: MDN: CSP upgrade-insecure-requests

Los subrecursos se actualizan también entre orígenes; la restricción al mismo origen corresponde a la navegación. Además, la reescritura ocurre antes de las comprobaciones de contenido mixto y CSP, por eso evita el bloqueo.

Tres límites:

  • No actualiza navegación superior a terceros. La documentación aclara: “However, top-level navigation requests whose target is a different origin will not be upgraded.” (traducción) «No se actualizarán las solicitudes de navegación de nivel superior cuyo destino sea otro origen». Por ello: “The upgrade-insecure-requests directive will not ensure that users visiting your site via links on third-party sites will be upgraded to HTTPS for the top-level navigation and thus does not replace the Strict-Transport-Security (HSTS) header.” (traducción) «La directiva no asegura la actualización HTTPS de la navegación superior iniciada desde enlaces de terceros y, en consecuencia, no reemplaza HSTS».
  • Es una red de seguridad, no una solución, y no ofrece recurso alternativo. Si no existe HTTPS, la solicitud falla y no vuelve a http://.
  • El modo de solo informe no realiza la actualización. upgrade-insecure-requests dentro de Content-Security-Policy-Report-Only se ignora. Para observar destinos http://, usa otra política de solo informe como default-src https:; configurar upgrade-insecure-requests en modo de solo informe no aporta visibilidad.

block-all-mixed-content: principalmente histórico

Según MDN, block-all-mixed-content “prevents loading any assets over HTTP when the page uses HTTPS,” (traducción) «impide cargar recursos mediante HTTP cuando la página usa HTTPS». Está deprecated y “obsolete in the specification,” (traducción) «obsoleta en la especificación», porque “Content that isn’t blocked is now always upgraded to a secure connection, so this directive is not needed.” (traducción) «El contenido no bloqueado ahora siempre se actualiza a una conexión segura, por lo que no se necesita». Usa upgrade-insecure-requests; considera block-all-mixed-content un legado. Si ya envías upgrade-insecure-requests, block-all-mixed-content es redundante porque la actualización ocurre antes.

Evidence for this claim block-all-mixed-content is deprecated and obsolete for new deployment. Scope: legacy CSP directives Confidence: high · Verified: CSP: block-all-mixed-content

Por qué tu CMS vuelve a introducirlo

Varios sistemas reinyectan URL http://:

  • Base de datos. En WordPress, Drupal y otros CMS, imágenes e incrustaciones http:// absolutas viven en el contenido, no en plantillas; una corrección de código no las toca.
  • Temas y plugins. Una URL de recurso http:// fija reaparece en cada página y una actualización puede devolverla.
  • Anuncios, analítica y terceros. Si un proveedor llama a http://, no puedes corregirlo en tu repositorio. Usa CSP para detectar, presiona al proveedor, sustituye o elimina; no hay una cuarta opción segura.
  • Service workers y cachés. Pueden repetir solicitudes antiguas que apuntan a http:// después de corregir la fuente. Prueba sin caché y aumenta la versión para expulsarlas.
  • http:// fijo en contenido antiguo y plantillas de correo/impresión reutilizadas.

Incorpora detección a una auditoría periódica —rastreador + CSP—, no a una lista de lanzamiento única.

Cómo interactúa con HSTS

Resuelven problemas contiguos:

  • upgrade-insecure-requests actualiza los subrecursos solicitados por la página segura.
  • HSTS (Strict-Transport-Security) fuerza la navegación superior a tu sitio mediante HTTPS, incluso la primera solicitud, y combate SSL stripping. Google lo presenta para “avoid the cost of the 301 redirect” (traducción) «evitar el coste de la redirección 301» y “defeat attacks like SSL Stripping.” (traducción) «derrotar ataques como SSL Stripping».

No se sustituyen. MDN indica que upgrade-insecure-requests “will not ensure that users visiting your site via links on third-party sites will be upgraded to HTTPS for the top-level navigation and thus does not replace the Strict-Transport-Security (HSTS) header.” (traducción) «no garantiza HTTPS superior para usuarios procedentes de enlaces de terceros y no sustituye HSTS». Una configuración endurecida usa upgrade-insecure-requests y HSTS. Google advierte “Don’t enable HSTS until you’re certain your site operation is robust enough to avoid ever deploying HTTPS with certificate validation errors,” (traducción) «No habilites HSTS hasta estar seguro de que nunca desplegarás HTTPS con errores de certificado»; la precarga se acerca a una puerta de sentido único.

¿Perjudica directamente al SEO?

Es ante todo un problema de seguridad y funcionamiento. CSS o JS activo bloqueado rompe el renderizado y la interacción, con independencia del buscador.

Las consecuencias SEO son condicionales, no garantizadas. Google no documenta una mejora directa de ranking por corregirlo; la señal HTTPS se basa en que la URL comienza por https://, no en limpiar subrecursos. Pero Googlebot podría renderizar una versión rota si se bloquea CSS/JS, un indicador degradado reduce confianza y conversiones, y la preferencia por canonical HTTPS depende de certificados, dependencias, redirecciones y señales coherentes. Verifica renderizado, indexación, canonicalización y analítica en tus páginas y corrige primero por seguridad y función.

Forma parte del tema HTTPS para SEO, que cubre migración, señal y HSTS. Los errores de cadena, caducidad y DV/OV/EV pertenecen al análisis hermano del certificado.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.