- Google intenta renderizar el iframe y, según su propia respuesta en las office hours de diciembre de 2023, sus sistemas «tratarían de asociar» el contenido de la subpágina a la página principal. No está garantizado: la URL del iframe sigue siendo una página indexable por sí misma.
- Si quieres que un contenido posicione, ponlo en el HTML de la página. El iframe sirve para lo que no necesita posicionar: vídeos, mapas, widgets y formularios de terceros.
- Con
noindexmásindexifembeddeden la URL del iframe, esa URL queda fuera del índice y su contenido puede seguir contando donde se incrusta. - Cada iframe debe llevar
title,widthyheight, y los que quedan bajo el pliegue,loading="lazy". Si el embed es pesado, mejor una facade que se carga al clic. X-Frame-Optionsyframe-ancestorsdeciden quién puede incrustar tu contenido. No tienen que ver con los iframes que tú pones en tus páginas.- En mi web no hay ningún iframe. Lo que sí hay es
X-Frame-Options: SAMEORIGINen el.htaccess.
La pregunta que más se repite sobre iframes es si Google lee lo que hay dentro. La respuesta corta es que sí lo intenta, pero hay un matiz que cambia decisiones: el contenido no pertenece solo a la página que lo incrusta. La URL del iframe es otra página, con su propio HTML, y Google puede indexarla por separado. Lo que no está documentado es cuál de las dos acaba mostrando en cada consulta.
Aquí separo lo que Google ha dicho de lo que se da por sabido, explico cuándo un iframe es buena idea y cuándo no, repaso los atributos y las cabeceras que importan, y cuento con honestidad qué hay en mi propia web, que es menos de lo que esperarías.

Qué es un iframe y por qué importa para el SEO
Un <iframe> incrusta un documento HTML dentro de otro. El navegador carga la URL del src como una página independiente, con su propio DOM, sus propios scripts y su propio ciclo de carga, y la pinta en un recuadro de la página anfitriona.
Para SEO eso tiene tres consecuencias. La primera es de contenido: lo que se ve dentro del recuadro vive en otra URL. La segunda es de rendimiento: cada iframe es una navegación adicional con sus recursos. La tercera es de control: tú decides qué incrustas, pero otros pueden incrustar lo tuyo si no lo impides.
Cómo trata Google el contenido de un iframe
Hay una fuente primaria reciente. En las office hours de Google de diciembre de 2023, John Mueller respondió a una pregunta sobre cómo indexar el contenido de un iframe. Su respuesta fue que, en general, los sistemas de Google «tratarían de asociar» el contenido de la subpágina como parte de la página principal para la indexación. Añadió que no está garantizado, porque ambas páginas son también páginas HTML independientes.
Esto matiza una idea muy extendida: que el contenido de un iframe «cuenta para la URL del iframe y no para la página». Lo que dice Google es lo contrario como intención por defecto, con una salvedad. Tampoco explica cómo resuelve cuando las dos URLs compiten por la misma consulta, y no he encontrado documentación que lo detalle.
Hay un antecedente de 2017 que va en la misma línea. Search Engine Roundtable recogió una respuesta de Mueller en un hangout: a quien preguntaba cómo hacer que la URL del iframe recibiera el crédito en lugar de la página que lo incrusta, le dijo que «la versión corta es que no se puede». Es una fuente secundaria y antigua, y la uso solo como contexto.
| Afirmación | Estado | Fuente |
|---|---|---|
| Google intenta renderizar iframes y asociar su contenido a la página principal | Documentado como comportamiento general, sin garantía | Office hours de Google, diciembre de 2023 |
| La URL del iframe puede indexarse por separado | Documentado: son páginas HTML independientes | Office hours, diciembre de 2023 |
noindex + indexifembedded permite indexar el contenido embebido sin indexar la URL | Documentado | Documentación de robots meta de Google |
X-Frame-Options que impide el iframe evita que el contenido cuente en la página anfitriona | Documentado como indicación de Mueller | Office hours, diciembre de 2023 |
| Qué URL se muestra cuando ambas compiten | No documentado | Sin fuente primaria |
| Un iframe posiciona peor que el mismo texto en la página | No documentado como regla; es recomendación de Mueller poner en la página lo que necesites indexar | Respuesta citada por Search Engine Journal |
Lo que no está documentado
No hay cifra oficial sobre cuántos iframes renderiza Googlebot, ni sobre si trata igual un iframe cargado con loading="lazy", uno inyectado con JavaScript o uno que necesita interacción. Lo razonable es asumir que un contenido que solo aparece tras un clic no se verá, igual que ocurre con cualquier contenido que exige acción del usuario (el caso general, con sus matices, está en mi guía de JavaScript SEO). Esto último es una inferencia mía, no una afirmación de Google.
Cuándo usar un iframe y cuándo no
La regla que aplico es sencilla: si el contenido debe posicionar a tu nombre, va en tu HTML. Si es un servicio de otro que solo necesitas mostrar, puede ir en un iframe.

| Caso | ¿Iframe? | Por qué |
|---|---|---|
| Vídeo de YouTube o Vimeo | Sí, con facade | El reproductor es del proveedor. Posicionar el vídeo depende de la página que lo contiene, su transcripción y los datos estructurados |
| Mapa de Google Maps | Sí, con carga diferida | No tiene sentido replicar un mapa interactivo. La dirección en texto sí debe estar en tu HTML |
| Calendario de reservas, encuesta, formulario de un CRM | Sí | Es una herramienta de tercero. Su contenido no es lo que quieres posicionar |
| Texto, guía o ficha de producto | No | Es lo que debe posicionar. Que viva en otra URL es un riesgo innecesario |
| Tabla de precios, FAQ, reseñas con valor SEO | No | Mismo motivo. Si necesitas un widget, busca una versión que inserte HTML en la página |
| Contenido propio reutilizado en otra web tuya | Depende | Para que no compitan, la URL del iframe debe quedar controlada: noindex con indexifembedded o canonical |
Una trampa frecuente es usar un iframe para una página de otro dominio propio, por ejemplo un blog alojado aparte, y esperar que la página principal herede el contenido. Lo más probable es que acabes con dos URLs indexables compitiendo, que es justo lo que Mueller advierte que no se puede controlar del todo. Si necesitas ese contenido en el dominio principal, es mejor servirlo desde ahí.
Atributos clave del iframe
Un iframe sin atributos funciona, pero cada uno de los que siguen evita un problema concreto. Todos aparecen en la documentación de MDN.

| Atributo | Para qué sirve | Detalle verificado |
|---|---|---|
title | Describe el contenido del iframe a lectores de pantalla | Sin él, el usuario tiene que entrar en el marco para saber qué contiene; MDN lo señala como confuso con varios iframes |
loading | lazy aplaza la carga hasta que el iframe se acerca al viewport | Solo aplaza si JavaScript está activado; el valor por defecto es eager |
sandbox | Restringe lo que puede hacer el contenido embebido | Vacío aplica todas las restricciones; con allow-scripts y allow-same-origin a la vez, el documento del mismo origen puede quitarse el sandbox |
allow | Permisos de funciones: cámara, micrófono, pantalla completa | Añade una restricción sobre el Permissions-Policy, no lo sustituye |
referrerpolicy | Qué referrer se envía al cargar el marco | Por defecto strict-origin-when-cross-origin; unsafe-url puede filtrar rutas |
width y height | Tamaño en píxeles CSS | Sin ellos el navegador usa 300 × 150; un width en CSS prevalece sobre el atributo |
Un ejemplo completo
<iframe
src="https://www.youtube.com/embed/ID_DEL_VIDEO"
title="Vídeo: cómo auditar los Core Web Vitals"
width="560" height="315"
loading="lazy"
allow="fullscreen"
referrerpolicy="strict-origin-when-cross-origin"
></iframe>
El sandbox no lo he puesto porque YouTube necesita scripts y, si activas el sandbox con allow-scripts y allow-same-origin, pierdes buena parte de su utilidad. Con widgets de terceros menos fiables sí lo uso, con la lista mínima de permisos que haga falta, y pruebo que el embed sigue funcionando.
El title es el atributo que más se olvida y el más barato. Un título concreto («Mapa de la oficina en Salamanca») sirve a quien usa lector de pantalla y deja claro el propósito del iframe a cualquier auditor. Es el mismo criterio que con las imágenes: describir la función, no rellenar de palabras; lo detallo en mi guía de texto alternativo.
Iframes, Core Web Vitals e INP
Un iframe de terceros suele ser de lo más pesado de una página. El artículo de web.dev sobre buenas prácticas con embeds indica que muchos incluyen más de 100 KB de JavaScript, a veces hasta 2 MB. Eso afecta a la carga, pero hay dos métricas con matices propios.
- CLS. Si no declaras
widthyheight, el recuadro mide 300 × 150 hasta que el embed se redimensiona y empuja el contenido de debajo. Web.dev menciona anuncios y widgets que se redimensionan como causa de desplazamientos. Los umbrales son 0,1 o menos para «bueno» y por encima de 0,25 para «malo». - INP. Web.dev indica que las interacciones ocurren en el documento principal o en iframes embebidos, y que la API de medición no reporta eventos de interacciones dentro de iframes. En iframes de otro origen, a veces no se puede medir el INP con JavaScript. Eso puede explicar diferencias entre CrUX y tu medición propia. El umbral de «bueno» es 200 ms o menos.
Mi lectura práctica: un widget lento dentro de un iframe puede estropear la experiencia sin aparecer en tus herramientas de medición propias. Por eso, ante un INP alto sin causa clara en tus scripts, conviene revisar qué iframes hay en la página. Los fundamentos de las tres métricas están en mi guía de Core Web Vitals.
Carga diferida de iframes
Poner loading="lazy" en los iframes que quedan bajo el pliegue es el primer paso. Web.dev calcula que en un embed de YouTube puede ahorrar unos 500 KB en la carga inicial. Cómo funciona, qué umbral usa cada navegador y los problemas habituales los trato en el artículo sobre lazy loading de iframes; aquí solo me interesa que no es lo mismo que una facade.
Facade para YouTube y Google Maps: cargar al clic
Una facade es un sustituto ligero que ocupa el lugar del embed: una imagen con un botón de reproducir. El iframe real solo se crea cuando el usuario hace clic. La documentación de Chrome lo resume en tres pasos: se añade la facade al cargar, al pasar el ratón se precarga la conexión con el proveedor y al hacer clic se sustituye por el producto real.

Para YouTube, las librerías de código abierto que citan tanto Chrome como web.dev son lite-youtube-embed y alternativas como lite-youtube. Web.dev afirma que lite-youtube-embed es 224 veces más rápido que el embed original; es una cifra del propio artículo y depende de cómo se mida. Para Vimeo existen lite-vimeo-embed y similares.
Una facade casera para mapas
Para un mapa no necesitas librería. Un botón con una imagen estática y un script mínimo bastan:
<button type="button" class="mapa-facade" data-src="https://www.google.com/maps/embed?pb=...">
<img src="/img/mapa-oficina.webp" width="600" height="400" alt="">
Ver mapa interactivo
</button>
<script>
document.querySelectorAll('.mapa-facade').forEach(function (b) {
b.addEventListener('click', function () {
var f = document.createElement('iframe');
f.src = b.dataset.src; f.width = 600; f.height = 400;
f.title = 'Mapa de la oficina'; f.loading = 'lazy';
b.replaceWith(f);
});
});
</script>
Las contrapartidas están en la propia documentación de Chrome: las facades no tienen toda la funcionalidad, y el autoplay de vídeos cargados de forma diferida puede no funcionar de forma consistente. Además, el contenido que solo existe tras el clic no se ve al rastrear (inferencia mía, como arriba). Por eso la dirección, el teléfono y el horario deben estar siempre como texto en tu HTML, no solo dentro del mapa.
Si la imagen de la facade es lo primero que ve el usuario en la zona visible, es candidata a LCP. Dale dimensiones, un formato ligero y no la cargues con loading="lazy" si está arriba del todo.
noindex e indexifembedded en la URL del iframe
Si el contenido del iframe es tuyo y no quieres que su URL aparezca en resultados, la combinación documentada es noindex más indexifembedded en la propia URL del iframe. La documentación de Google lo recoge como regla de robots: permite indexar el contenido de una página cuando está embebida en otra mediante iframe o etiquetas HTML similares, a pesar de una regla noindex. Solo tiene efecto acompañada de noindex, y otros buscadores pueden no tratarla igual. Además, Google solo lee esa directiva si puede rastrear la URL del iframe: si la bloqueas en robots.txt, no verá el noindex, como explico en mi guía de robots.txt.
<meta name="robots" content="noindex, indexifembedded">

Search Engine Roundtable recogió en marzo de 2023 que la herramienta de inspección de URLs de Search Console ya mostraba la presencia de indexifembedded en la URL de embebido de un vídeo. El caso de uso que contaba Vimeo era el de vídeos no listados. Si prefieres una cabecera en lugar de una meta, el funcionamiento de X-Robots-Tag lo explico en mi guía de X-Robots-Tag; no he probado indexifembedded en cabecera, así que compruébalo en la inspección de URLs si lo necesitas.
X-Frame-Options y frame-ancestors: cuando alguien incrusta tu contenido
Hasta aquí hemos hablado de los iframes que pones tú. Hay un segundo lado: quién puede incrustar tus páginas en las suyas. Se controla con cabeceras en la respuesta de tu servidor.

| Cabecera | Valores | Notas verificadas |
|---|---|---|
X-Frame-Options | DENY, SAMEORIGIN | ALLOW-FROM es obsoleto y los navegadores modernos lo ignoran. Puesta en una <meta> no tiene efecto |
Content-Security-Policy: frame-ancestors | 'none', 'self', lista de orígenes | No usa default-src como respaldo, tampoco funciona en <meta>. Según la especificación HTML, tiene prioridad sobre X-Frame-Options |
Una política tipo default-src 'none' sin frame-ancestors no impide que te incrusten, porque la directiva no hereda. Es un error fácil de cometer al endurecer una CSP.
Content-Security-Policy: frame-ancestors 'self' https://socio.example
X-Frame-Options: SAMEORIGIN
Para SEO esto tiene dos efectos. Por un lado, evita que terceros enmarquen tu web con otro diseño o publicidad encima (clickjacking). Por otro, según las office hours de diciembre de 2023, una cabecera X-Frame-Options que impide el iframe evita que ese contenido se indexe dentro de la página anfitriona. Si quieres que otros sitios te incrusten y que sumes por ello, no pongas la restricción en esas URLs.
Cómo lo tengo en mi web
Esto es lo que he comprobado leyendo el código de cristofercruz.net, sin añadir nada:

- Ningún iframe. No hay
<iframe>en las plantillas, en las páginas de servicios ni en las de ubicaciones. Tampoco hay vídeos,<video>ni<embed>. - Ningún mapa. La única referencia a Google Maps en el código es un campo de texto de una herramienta, donde pegas una URL. No incrusta ningún mapa.
- Banner de cookies propio, sin iframes. El aviso es un script mío. Las plantillas de proveedores (analítica, píxeles de publicidad) son
<template>inertes con scripts, y en la configuración de seguimiento todos los proveedores están desactivados hoy. - Formulario propio. El formulario de contacto es HTML de la propia web, no un formulario de terceros incrustado.
- Cabecera
X-Frame-Options: SAMEORIGIN. Está en el.htaccess, conHeader always setdentro de un bloquemod_headers. Solo mi propio dominio puede incrustar mis páginas. frame-ancestors 'none'ensend.php. El manejador del formulario envía además una CSP con esa directiva yX-Robots-Tag: noindex, nofollow.
Un límite: la cabecera del .htaccess no la he comprobado en la web en producción. El servidor PHP de pruebas con el que trabajo no interpreta el .htaccess, y mi lectura se basa en el archivo. Compruébalo con curl -I contra el dominio real, como explico más abajo.
Tampoco aplico frame-ancestors a las páginas normales: dependen de X-Frame-Options. Si algún día incrusto algo, el orden es el de este artículo: title, dimensiones, loading, facade si pesa, y la dirección o los datos clave siempre como texto.
Cómo auditar los iframes de una web

- Inventario. Rastrea el sitio con un crawler que extraiga elementos con XPath (
//iframe) o buscaiframeen el código renderizado. Apunta página,srcy proveedor. Los iframes inyectados por scripts solo salen en el HTML renderizado. - Atributos. Para cada uno, comprueba
title,width,heightyloading. Los que no tengan título ni dimensiones son los primeros de la lista. - Contenido propio. Si el
srces una URL tuya, inspecciónala en Search Console: indexación permitida, canonical y si apareceindexifembedded. Ahí decides si debe seguir indexable. - Rendimiento. En DevTools, pestaña Network, filtra por «Doc» y mira cuánto pesa cada iframe y cuándo empieza. Si alguno es de los más pesados, es candidato a facade.
- Cabeceras. Comprueba qué envían tus URLs:
curl -sI https://tudominio.com/pagina/ | grep -i -E "x-frame-options|content-security-policy"
Si quieres que lo revise alguien con ojo de auditor en todo el sitio, es parte de lo que incluyo en una auditoría técnica.
Preguntas frecuentes sobre iframes y SEO
¿Google indexa el contenido de un iframe?
Google intenta renderizar el iframe y, según sus office hours de diciembre de 2023, sus sistemas tratarían de asociar ese contenido a la página principal. No está garantizado, porque la URL del iframe también es una página HTML independiente y puede indexarse por su cuenta.
¿Un iframe perjudica al posicionamiento?
Google no documenta una penalización por usar iframes. Lo que sí hay son riesgos indirectos: contenido que acaba en otra URL, carga más pesada y desplazamientos de diseño si no reservas el espacio. Si algo debe posicionar, ponlo en el HTML de la página.
¿Cómo evito que la URL de mi iframe aparezca en Google?
Usa noindex junto con indexifembedded en esa URL: la URL no se indexa, pero su contenido puede seguir indexándose donde se incrusta. Solo funciona combinada con noindex y otros buscadores pueden no respetarla.
¿Hace falta poner title a un iframe?
Sí, por accesibilidad. MDN explica que sin él, quien usa lector de pantalla tiene que entrar en el marco para saber qué contiene. Un título breve y concreto es suficiente.
¿Para qué sirven X-Frame-Options y frame-ancestors?
Para decidir quién puede incrustar tus páginas. X-Frame-Options admite DENY y SAMEORIGIN; frame-ancestors permite además listar orígenes concretos y tiene prioridad según la especificación HTML. Ninguna funciona dentro de una etiqueta <meta>.
¿Conviene usar facade para los vídeos de YouTube?
Si el vídeo no es lo principal de la página, sí: la documentación de Chrome cita una facade de unos 3 KB frente a un reproductor de unos 540 KB. A cambio pierdes algo de funcionalidad, y el autoplay puede no comportarse igual.
¿Un iframe afecta a los Core Web Vitals?
Sí. Sin dimensiones puede provocar desplazamientos (CLS), y un widget pesado puede empeorar la carga. Con el INP hay un matiz: según web.dev, la API no reporta interacciones dentro de iframes, y en los de otro origen a veces no se puede medir con JavaScript.
Referencias y fuentes
- December 2023 Google SEO office hours Google Search Central
- Robots meta tag, data-nosnippet y X-Robots-Tag Google Search Central
- <iframe>: The Inline Frame element MDN Web Docs
- X-Frame-Options MDN Web Docs
- CSP: frame-ancestors MDN Web Docs
- Best practices for using third-party embeds web.dev
- Lazy load third-party resources with facades Chrome for Developers
- Interaction to Next Paint (INP) web.dev
- Cumulative Layout Shift (CLS) web.dev
- Google & iFrames: Debunking Myths, Understanding SEO Impact Search Engine Journal
- Google Search Console Shows If embedURL Page Uses indexifembedded Search Engine Roundtable
- Google Can Index Content In iFrames: SEOing iFrames Search Engine Roundtable




