PRIVACIDAD

Tus preferencias.

Rechazar no limita el acceso a la web. Cerrar sin guardar conserva tu decisión anterior.

Técnicas · siempre activas

Guardamos únicamente tu elección durante un máximo de 12 meses en este navegador.

Consultar proveedores, duración y transferencias

Multimedia

Iframes y SEO: cómo los trata Google y cómo optimizarlos

Qué dice Google sobre el contenido de un iframe, cuándo usarlo, qué atributos poner, cómo cargarlo con facade y qué iframes tiene realmente mi web.

¿Quieres aplicarlo a tu web?Hablemos
ResumenQué es un iframe y por qué importa para el SEO
Puntos clave
  • 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 noindex más indexifembedded en la URL del iframe, esa URL queda fuera del índice y su contenido puede seguir contando donde se incrusta.
  • Cada iframe debe llevar title, width y height, y los que quedan bajo el pliegue, loading="lazy". Si el embed es pesado, mejor una facade que se carga al clic.
  • X-Frame-Options y frame-ancestors deciden 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: SAMEORIGIN en 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.

Una página anfitriona con un iframe que apunta a una URL de contenido; Google asocia ese contenido a la página principal, pero la URL del iframe sigue siendo una página indexable por sí misma.
Dos URLs, un mismo contenido: la página que incrusta y la URL del iframe. Google intenta asociar el contenido a la primera, sin garantía.

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ónEstadoFuente
Google intenta renderizar iframes y asociar su contenido a la página principalDocumentado como comportamiento general, sin garantíaOffice hours de Google, diciembre de 2023
La URL del iframe puede indexarse por separadoDocumentado: son páginas HTML independientesOffice hours, diciembre de 2023
noindex + indexifembedded permite indexar el contenido embebido sin indexar la URLDocumentadoDocumentación de robots meta de Google
X-Frame-Options que impide el iframe evita que el contenido cuente en la página anfitrionaDocumentado como indicación de MuellerOffice hours, diciembre de 2023
Qué URL se muestra cuando ambas compitenNo documentadoSin fuente primaria
Un iframe posiciona peor que el mismo texto en la páginaNo documentado como regla; es recomendación de Mueller poner en la página lo que necesites indexarRespuesta 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.

Dos columnas: casos en los que usar iframe (vídeos, mapas, widgets, formularios de terceros) y casos en los que no (textos, tablas, FAQ o fichas que quieres posicionar).
Iframe para lo que es de otro y solo hay que mostrar; HTML propio para lo que debe posicionar.
Caso¿Iframe?Por qué
Vídeo de YouTube o VimeoSí, con facadeEl 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 MapsSí, con carga diferidaNo tiene sentido replicar un mapa interactivo. La dirección en texto sí debe estar en tu HTML
Calendario de reservas, encuesta, formulario de un CRMSíEs una herramienta de tercero. Su contenido no es lo que quieres posicionar
Texto, guía o ficha de productoNoEs lo que debe posicionar. Que viva en otra URL es un riesgo innecesario
Tabla de precios, FAQ, reseñas con valor SEONoMismo motivo. Si necesitas un widget, busca una versión que inserte HTML en la página
Contenido propio reutilizado en otra web tuyaDependePara 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.

Seis tarjetas con los atributos title, loading, sandbox, allow, referrerpolicy y width con height, cada una con su función en una frase.
Los seis atributos que reviso en cualquier iframe.
AtributoPara qué sirveDetalle verificado
titleDescribe el contenido del iframe a lectores de pantallaSin él, el usuario tiene que entrar en el marco para saber qué contiene; MDN lo señala como confuso con varios iframes
loadinglazy aplaza la carga hasta que el iframe se acerca al viewportSolo aplaza si JavaScript está activado; el valor por defecto es eager
sandboxRestringe lo que puede hacer el contenido embebidoVacío aplica todas las restricciones; con allow-scripts y allow-same-origin a la vez, el documento del mismo origen puede quitarse el sandbox
allowPermisos de funciones: cámara, micrófono, pantalla completaAñade una restricción sobre el Permissions-Policy, no lo sustituye
referrerpolicyQué referrer se envía al cargar el marcoPor defecto strict-origin-when-cross-origin; unsafe-url puede filtrar rutas
width y heightTamaño en píxeles CSSSin 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 width y height, 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.

Comparación entre un iframe de YouTube cargado desde el inicio con unos 540 KB y una facade de unos 3 KB que carga el reproductor solo al hacer clic.
Cifras del ejemplo de YouTube en la documentación de Chrome: la facade pesa unos 3 KB y el reproductor, unos 540 KB, solo se descarga al interactuar.

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">
Tres opciones para la URL de un iframe: sin directivas se pueden indexar ambas URLs, noindex con indexifembedded indexa solo el contenido dentro de la página anfitriona y X-Frame-Options que impide el iframe evita que cuente en la anfitriona.
Tres configuraciones de la URL del iframe y su efecto según la documentación y las office hours de Google.

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.

Un sitio externo intenta incrustar una página tuya; X-Frame-Options con DENY o SAMEORIGIN y frame-ancestors con none, self o una lista de dominios deciden si el navegador lo permite.
La cabecera la envía la página que se quiere proteger, no la que incrusta.
CabeceraValoresNotas verificadas
X-Frame-OptionsDENY, SAMEORIGINALLOW-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ígenesNo 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:

Resumen de la situación real de cristofercruz.net: ningún iframe en las plantillas ni en las páginas, ningún mapa ni vídeo incrustado, X-Frame-Options SAMEORIGIN en el htaccess y frame-ancestors none en el manejador del formulario.
Lo que hay y lo que no hay en mi web respecto a iframes, según el código.
  • 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, con Header always set dentro de un bloque mod_headers. Solo mi propio dominio puede incrustar mis páginas.
  • frame-ancestors 'none' en send.php. El manejador del formulario envía además una CSP con esa directiva y X-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

Cuatro pasos de auditoría: inventariar iframes, revisar sus atributos, inspeccionar la URL en Search Console y comprobar las cabeceras con curl.
Auditoría de iframes en cuatro pasos.
  1. Inventario. Rastrea el sitio con un crawler que extraiga elementos con XPath (//iframe) o busca iframe en el código renderizado. Apunta página, src y proveedor. Los iframes inyectados por scripts solo salen en el HTML renderizado.
  2. Atributos. Para cada uno, comprueba title, width, height y loading. Los que no tengan título ni dimensiones son los primeros de la lista.
  3. Contenido propio. Si el src es una URL tuya, inspecciónala en Search Console: indexación permitida, canonical y si aparece indexifembedded. Ahí decides si debe seguir indexable.
  4. 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.
  5. 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.

Auditoría SEO

Ver auditoría SEO

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

  1. December 2023 Google SEO office hours Google Search Central
  2. Robots meta tag, data-nosnippet y X-Robots-Tag Google Search Central
  3. <iframe>: The Inline Frame element MDN Web Docs
  4. X-Frame-Options MDN Web Docs
  5. CSP: frame-ancestors MDN Web Docs
  6. Best practices for using third-party embeds web.dev
  7. Lazy load third-party resources with facades Chrome for Developers
  8. Interaction to Next Paint (INP) web.dev
  9. Cumulative Layout Shift (CLS) web.dev
  10. Google & iFrames: Debunking Myths, Understanding SEO Impact Search Engine Journal
  11. Google Search Console Shows If embedURL Page Uses indexifembedded Search Engine Roundtable
  12. Google Can Index Content In iFrames: SEOing iFrames Search Engine Roundtable

Sigue leyendo

WPO

· 13 min

Lazy loading en iframes: cómo aplicarlo sin romper el SEO

Cuándo usar loading="lazy" en iframes, qué no diferir nunca, cómo evitar CLS y cuándo conviene una facade para YouTube o Maps. Con la visión de Googlebot.

Leer el artículo: Lazy loading en iframes: cómo aplicarlo sin romper el SEO
Rastreo

· 13 min

X-Robots-Tag: qué es y cómo usarlo en Apache, Nginx y PHP

La cabecera HTTP que hace de meta robots para PDF e imágenes: directivas que soporta Google, configuración por servidor y el error de bloquearla con robots.txt.

Leer el artículo: X-Robots-Tag: qué es y cómo usarlo en Apache, Nginx y PHP

Tu próximo paso empieza con una conversación.

Cuéntame qué necesitas conseguir con tu web.

Hablemos de tu proyecto