Índice de sitemaps: qué es, sus límites y cómo leerlo

Índice de sitemaps: qué es, sus límites y cómo leerlo

Un índice de sitemaps es un archivo XML que lista otros sitemaps en lugar de páginas. WordPress, Yoast SEO y Rank Math publican uno, y los sitios grandes lo necesitan en cuanto superan las 50.000 URL. Aquí tienes su formato, los límites que fijan Google y el protocolo, los errores más frecuentes y tres formas de leer todos los sitemaps secundarios a los que apunta.

Formato y límites de un índice de sitemaps

Un índice lista sitemaps, no páginas. Los buscadores lo abren, después abren cada archivo que nombra y solo entonces llegan a las URL de tus páginas. Los sitios grandes lo necesitan porque un solo sitemap admite como máximo 50.000 URL y 50 MB. WordPress, Yoast SEO y Rank Math lo usan incluso en sitios pequeños, porque reparten las URL por tipo de contenido. Nuestra guía muestra dónde publica WordPress su índice.

El elemento raíz es sitemapindex, en el mismo espacio de nombres que un sitemap normal. Cada archivo listado tiene una entrada sitemap con dos etiquetas:

  • loc: la URL completa del sitemap secundario. Es obligatoria.
  • lastmod: cuándo se modificó ese archivo por última vez, en formato W3C Datetime. Es opcional.
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://example.com/post-sitemap.xml</loc>
    <lastmod>2026-10-28T09:12:00+00:00</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://example.com/page-sitemap.xml.gz</loc>
    <lastmod>2026-10-02</lastmod>
  </sitemap>
</sitemapindex>

Un índice no lleva changefreq ni priority. Fíjate en lo que significa aquí lastmod: sitemaps.org lo define como el momento en que cambió el archivo de sitemap, no las páginas que contiene. Un sitemap secundario puede estar comprimido con gzip, como en la segunda entrada.

Los límites vienen del protocolo de sitemaps.org, y Google añade algunos:

Regla Valor Fuente
Sitemaps listados en un índice 50.000 como máximo sitemaps.org, Google
Tamaño del archivo 50 MB (52.428.800 bytes) sin comprimir sitemaps.org, Google
Compresión gzip permitido sitemaps.org
Archivos de índice por sitio en Search Console 500 Google
Un índice dentro de otro no permitido Google

Google indica que todos los requisitos de los sitemaps se aplican también a los archivos de índice, así que el límite de 50 MB se mide después de descomprimir.

Anidamiento y reglas del mismo host

Google no acepta un índice dentro de otro. La ayuda de su informe de sitemaps dice que un índice solo puede listar archivos de sitemap, y el informe muestra un error de anidamiento cuando encuentra uno. El protocolo no dice nada al respecto, así que algunos generadores siguen anidándolos. Aplana el árbol: haz que el archivo principal apunte directamente a los archivos que contienen URL. Con más de 50.000 sitemaps, repártelos en varios archivos de índice y envía cada uno.

El protocolo también dice que un índice solo puede listar sitemaps del mismo sitio. Google añade dos detalles:

  • Los sitemaps secundarios deben estar en el mismo directorio que el índice, o más abajo en la jerarquía del sitio.
  • La regla del mismo sitio deja de aplicarse si configuras el envío entre sitios, lo que supone demostrar que controlas cada host.

Así, un índice en https://example.com/sitemap.xml no debería listar https://cdn.example.net/products.xml ni http://www.example.com/posts.xml. Los dos cuentan como otros hosts. Para una URL de un nivel superior o de otro dominio, el informe indica «URL no permitida».

Enviarlo en Search Console y en robots.txt

En el informe de sitemaps, escribe la URL del índice y haz clic en «Enviar». Ese único envío cubre todos los sitemaps secundarios. En un índice, según la página de ayuda, «Páginas descubiertas» cuenta todas las URL de todos sus sitemaps secundarios. También puedes enviar un sitemap secundario si quieres ver su propia fila y su estado, pero no es obligatorio.

  • Las redirecciones no se siguen para la URL que envías. Envía la dirección final, la que responde con un código 200.
  • El informe solo lista los sitemaps enviados en él o mediante la API, así que un archivo que Google encontró en robots.txt no aparece.

En robots.txt, añade una línea con la URL completa, en cualquier parte del archivo:

Sitemap: https://example.com/sitemap_index.xml

El protocolo dice que, con un índice, puedes indicar solo la ubicación de ese archivo. La línea forma parte del protocolo de sitemaps.org, así que no es exclusiva de Google.

Errores frecuentes y sus causas

La mayoría de los problemas vienen de los sitemaps secundarios, no del archivo de índice.

  • Sitemap secundario en otro host. Un cambio de http a https, o de www a sin www, deja URL antiguas en el índice. Cada loc debe usar el esquema y el host del índice.
  • URL relativa. <loc>/post-sitemap.xml</loc> no es válido. Google indica que la URL está incompleta.
  • El sitemap secundario devuelve un 404. Se desactivó un plugin, se eliminó un tipo de contenido o una caché sirve un índice antiguo.
  • El sitemap secundario devuelve HTML. Una página de acceso, una comprobación de seguridad o la página 404 del tema, enviadas con un código 200. Nuestro artículo sobre un sitemap que Google no obtiene explica cómo detectarlo con una prueba en tiempo real.
  • Formato de lastmod incorrecto. 15/10/2026 no es W3C Datetime. Escribe 2026-10-15, o 2026-10-15T14:30:00+00:00 con hora y zona horaria. Google indica «Fecha no válida».
  • Índice anidado. Lista en su lugar los archivos que contiene.

Cómo leer todos los sitemaps secundarios

Abrir cincuenta archivos uno a uno es lento. Aquí tienes tres formas de verlos todos.

Comprobar el archivo de índice con el comprobador de sitemaps

Pega el índice en el comprobador de sitemaps gratuito, o abre el archivo .xml o .xml.gz. Reconoce un índice y muestra cada sitemap secundario con su lastmod en una tabla «Sitemaps». Señala las URL relativas o que no son http, las fechas no válidas, los duplicados, los sitemaps secundarios repartidos en varios hosts, las entradas url o los changefreq y priority colocados en un índice, y los archivos de más de 50.000 entradas o 50 MB.

Solo comprueba ese archivo. La página nunca se conecta a otros sitios web, así que no abre los sitemaps secundarios y no puede saber si alguno devuelve un 404 o HTML. Su veredicto te recuerda que compruebes también cada sitemap listado.

Cargar todos los sitemaps secundarios con XMLNest

La extensión XMLNest para Chrome abre un índice publicado en su vista «Lectura». Haz clic en «Cargar todos los sitemaps secundarios» y los pide uno a uno, con una línea de progreso y un botón «Cancelar»:

  • Solo se piden los sitemaps del mismo sitio que el índice (mismo esquema, host y puerto). Los demás muestran «Omitido: está en otro sitio, nunca se pide».
  • Hasta 50 sitemaps secundarios, de 50 MB cada uno; los archivos .gz se descomprimen.
  • Las redirecciones no se siguen, y un índice anidado se omite.
  • Cada fallo indica el motivo: el código HTTP, «Error: el XML no está bien formado» o «Error: no es un sitemap» con la etiqueta raíz encontrada, que es como aparece una página HTML.

Vista Lectura de XMLNest en un archivo de índice de WordPress: Load all child sitemaps ha cargado 3 de 3 sitemaps, con 12, 5 y 4 URL

XMLNest en Chrome, con la interfaz en inglés, en un índice de WordPress tras «Load all child sitemaps».

Las URL de todos los sitemaps cargados van a una sola tabla, con una columna para su archivo de origen. La pestaña «Problemas» aplica las reglas del comprobador de sitemaps a cada archivo y lista las URL que aparecen en dos sitemaps secundarios. Nuestro artículo sobre cómo extraer las URL de un sitemap explica la exportación a CSV y JSON.

Expandir el índice con Python

Esta función lee un índice, sigue cada sitemap secundario del mismo host, descomprime gzip e imprime cada URL de página una sola vez. Solo usa la biblioteca estándar.

import gzip
import sys
import urllib.request
import xml.etree.ElementTree as ET
from urllib.parse import urlsplit

NS = "{http://www.sitemaps.org/schemas/sitemap/0.9}"

def fetch(url):
    req = urllib.request.Request(url, headers={"User-Agent": "expand-index/1.0"})
    with urllib.request.urlopen(req, timeout=30) as resp:
        data = resp.read()
    if data[:2] == b"\x1f\x8b":  # gzip, diga lo que diga el nombre del archivo
        data = gzip.decompress(data)
    return ET.fromstring(data)

def locs(root, entry):
    return [el.text.strip() for el in root.findall(f"{NS}{entry}/{NS}loc") if el.text]

def page_urls(index_url):
    root = fetch(index_url)
    if root.tag == NS + "urlset":
        return locs(root, "url")
    host = urlsplit(index_url).netloc
    pages = []
    for child in locs(root, "sitemap"):
        if urlsplit(child).netloc != host:
            print("skipped, other host:", child, file=sys.stderr)
            continue
        try:
            sub = fetch(child)
        except Exception as err:
            print("failed:", child, err, file=sys.stderr)
            continue
        if sub.tag != NS + "urlset":
            print("skipped, not a urlset:", child, file=sys.stderr)
            continue
        found = locs(sub, "url")
        print(f"{child}: {len(found)} URLs", file=sys.stderr)
        pages.extend(found)
    return pages

if __name__ == "__main__":
    for url in dict.fromkeys(page_urls(sys.argv[1])):
        print(url)

Ejecuta python expand_index.py https://example.com/sitemap.xml > urls.txt. El informe sale en pantalla y las URL van al archivo. Lo ejecutamos en un índice de prueba local con cinco entradas. Leyó dos sitemaps secundarios, uno de ellos comprimido con gzip, y devolvió sus cinco URL de páginas. Omitió un índice anidado y un sitemap secundario en otro host, e informó de «HTTP Error 404» para un archivo que no existía.

Lista de comprobación antes de enviarlo

  • La raíz es sitemapindex con el espacio de nombres de sitemaps.org, y cada entrada tiene un loc completo.
  • Como máximo 50.000 entradas y 50 MB sin comprimir; ningún índice dentro de otro.
  • Todos los sitemaps secundarios están en el mismo host y con el mismo esquema que el índice, en el mismo directorio o más abajo.
  • Todos los sitemaps secundarios responden 200 con XML, no con una redirección, un 404 o HTML.
  • lastmod usa W3C Datetime y cambia cuando cambia el archivo.
  • Envía el índice una vez en Search Console y añade una línea Sitemap: al robots.txt.

Preguntas

¿Envío el índice o cada sitemap secundario?

Basta con enviar el índice: Google lee los sitemaps que lista, y el recuento de «Páginas descubiertas» del índice suma las URL de todos sus sitemaps secundarios. También puedes enviar un sitemap secundario por separado si quieres ver su estado en una fila propia.

¿Un índice de sitemaps puede listar otro índice?

No. La ayuda de Google indica que un índice de sitemaps solo puede listar archivos de sitemap, y muestra el error «Índices de sitemaps anidados» cuando encuentra uno. Si tienes más de 50.000 sitemaps, repártelos en varios archivos de índice y envía cada uno.

¿El lastmod de una entrada sitemap describe las páginas?

No. En un índice de sitemaps, lastmod es la fecha en que se modificó el propio archivo de sitemap. Las fechas de las páginas van en las etiquetas lastmod de los sitemaps secundarios.

Fuentes

  1. sitemaps.org: Protocolo (consultada el 29 de octubre de 2026)
  2. Google Search Central: Gestionar sitemaps con archivos de índice de sitemaps (consultada el 29 de octubre de 2026)
  3. Google Search Central: Crear y enviar un sitemap (consultada el 29 de octubre de 2026)
  4. Gestionar sitemaps con el informe Sitemaps - Ayuda de Search Console (consultada el 29 de octubre de 2026)
  5. Prueba de XMLNest: el script de Python de este artículo, ejecutado con Python 3.14.3 en un índice de ejemplo local : Índice con 5 entradas: 2 sitemaps secundarios leídos (uno comprimido con gzip, 5 URL de páginas en total), 1 índice anidado omitido, 1 sitemap secundario que responde 404 y 1 sitemap secundario en otro host omitido. (consultada el 29 de octubre de 2026)