wandres.dev
SEO · metadatos, OG, JSON-LD

Estrategia de indexación: noindex, duplicados y paginación

Más allá del sitemap y el robots.txt ya vistos: separar el rastreo de la indexación, usar noindex para sacar páginas del índice sin esconderlas del rastreo, consolidar duplicados y URLs con parámetros mediante la canónica, y tratar la paginación de forma que cada página se sostenga sola en lugar de colapsarla contra la primera.

⏱ 17 min

Ya sabes generar el sitemap y el robots.txt; ahora toca la decisión más estratégica del SEO técnico, la que ninguna herramienta toma por ti: qué de tu sitio merece estar en el índice del buscador y qué no. No todas las páginas quieren ser encontradas. Un panel de administración, una página de agradecimiento tras un formulario, cientos de URLs con parámetros de filtro, las diez variantes casi idénticas de un listado paginado: publicarlas todas al índice no te da alcance, te diluye. Esta lección trata de gobernar el índice con intención, distinguiendo las dos palancas —rastreo e indexación— que la gente confunde a diario y que hacen cosas opuestas.

🎯 Al terminar esta lección sabrás
  • Separar el rastreo de la indexación y saber qué control gobierna cada uno.
  • Usar noindex para sacar una página del índice sin bloquear su rastreo.
  • Consolidar duplicados y URLs con parámetros mediante la canónica.
  • Tratar la paginación para que cada página sea indexable por sí misma.

Rastreo e indexación: dos controles distintos

La confusión más cara del SEO técnico es creer que robots.txt y noindex hacen lo mismo. No. El robots.txt gobierna el rastreo: le dice al buscador qué URLs puede visitar. La etiqueta noindex gobierna la indexación: le dice qué páginas, una vez visitadas, no debe guardar en su índice. Son fases distintas de un mismo proceso, y confundirlas produce el error clásico. Si bloqueas una página con Disallow en robots.txt y le pones noindex, el buscador nunca la visita, así que nunca ve la etiqueta noindex, así que —si ya la conocía por enlaces externos— puede mantenerla en el índice sin poder leer tu orden de sacarla.

La regla que resuelve el enredo: para sacar del índice una página, déjala rastreable y ponle noindex; el buscador ha de poder entrar para leer la orden. Usa Disallow solo para lo que no quieres que se rastree en absoluto —ahorrar presupuesto de rastreo en zonas infinitas o irrelevantes—, sabiendo que eso no garantiza que no se indexe. Rastreo e indexación son dos puertas con dos llaves; usar la llave equivocada deja la puerta que querías cerrar abierta de par en par.

Un matiz para SSR y recursos que no son HTML: la orden de no indexar también viaja por la cabecera HTTP X-Robots-Tag, no sólo por la etiqueta <meta>. Es la única vía para un PDF o una imagen, que no tienen <head> donde colgar la etiqueta, y resulta cómoda en endpoints donde ya controlas la respuesta con sus cabeceras.

// noindex por cabecera, util para PDFs y respuestas de endpoint
export const GET: APIRoute = () => {
  return new Response(cuerpo, {
    headers: { 'X-Robots-Tag': 'noindex' },
  });
};

noindex: sacar del índice sin esconder del rastreo

La orden de no indexar viaja en una <meta name="robots"> con el valor noindex, a menudo acompañada de nofollow cuando tampoco quieres que se sigan los enlaces de esa página. En nuestro componente <SEO /> ya reservamos una prop noindex para esto, de modo que marcar una página es pasar un booleano, no recordar una sintaxis.

---
// dentro de src/components/SEO.astro
const { noindex = false } = Astro.props;
---
{noindex && <meta name="robots" content="noindex, nofollow" />}
---
// una página que no debe indexarse
import Base from '../layouts/Base.astro';
---
<Base title="Gracias" description="Formulario recibido" noindex={true}>
  <h1>Gracias por tu mensaje</h1>
</Base>

Los candidatos naturales al noindex son las páginas sin valor de búsqueda propio: resultados de búsqueda interna, páginas de agradecimiento, versiones de impresión, listados filtrados que sólo reordenan contenido que ya vive en otra URL. Sacarlas del índice no te resta; concentra la atención del buscador en las páginas que de verdad quieres que compitan, y evita que tu sitio parezca un almacén de contenido delgado y repetido.

El caso más traicionero es la navegación por facetas: una tienda con filtros de color, talla, marca y precio genera, al combinarlos, un número casi infinito de URLs, casi todas variantes triviales del mismo listado. Dejarlas entrar al índice lo inunda de contenido delgado; dejarlas rastrear sin freno agota el presupuesto de rastreo en un laberinto sin fondo. La respuesta combina las tres palancas de este nivel: noindex en las combinaciones sin valor de búsqueda, canónica hacia el listado limpio para consolidar señales, y Disallow en los parámetros que ni siquiera merece la pena visitar. Ninguna basta sola; el criterio está en repartir bien el trabajo entre ellas según lo que cada URL merezca.

⚠️
noindex en una página bloqueada no surte efecto

Si una página tiene Disallow en robots.txt, el buscador no la rastrea y por tanto no lee su noindex. Para des-indexar algo, primero permite su rastreo; una vez que ha desaparecido del índice, si además quieres ahorrar rastreo, puedes bloquearla. El orden importa: noindex primero, Disallow después, nunca los dos a la vez sobre una URL que aún quieres purgar del índice.

Duplicados y la canónica como consolidador

El contenido duplicado rara vez es malicioso; casi siempre es un efecto colateral de cómo se generan las URLs. La misma ficha se alcanza con ?utm_source= de una campaña, con ?orden=precio de un filtro, con y sin barra final, por www y sin www. Para el buscador son direcciones distintas con el mismo contenido, y sin una señal clara reparte la autoridad entre todas y elige él cuál mostrar. La <link rel="canonical"> consolida ese reparto: todas las variantes apuntan a una misma URL limpia, y el buscador transfiere a ella las señales dispersas.

---
// la canónica ignora el querystring y apunta a la ruta limpia
const canonical = new URL(Astro.url.pathname, Astro.site);
---
<link rel="canonical" href={canonical.href} />

Deriva la canónica de Astro.url.pathname, que no incluye la cadena de consulta, y una URL con ?orden=precio declarará como canónica su versión sin parámetros. Aquí conviene un matiz que separa a quien entiende el mecanismo de quien lo aplica de memoria: la canónica es una pista fuerte, no una orden. El buscador la respeta casi siempre, pero puede ignorarla si detecta que las páginas no son realmente equivalentes. Por eso la canónica no sustituye al noindex: una consolida señales entre duplicados, la otra excluye del índice sin ambigüedad. Elige según la intención, no según cuál recuerdes primero.

Hay una forma de duplicado que la canónica no debe resolver: el mismo contenido en varios idiomas. Ahí las páginas no son copias que consolidar, sino equivalentes que el buscador debe servir según el usuario, y la señal correcta es hreflang, no la canónica. Cada versión declara con rel="alternate" sus hermanas por idioma, más una x-default para quien no encaje en ninguna, y todas se referencian entre sí de forma recíproca.

---
// una etiqueta alternate por idioma, derivada de la config i18n
const alternativas = [
  { lang: 'es', url: '/sobre-mi/' },
  { lang: 'en', url: '/en/about/' },
];
---
{alternativas.map((a) => (
  <link rel="alternate" hreflang={a.lang} href={new URL(a.url, Astro.site).href} />
))}

Como todo en este nivel, esas etiquetas se derivan de una sola fuente —tu configuración de idiomas— en lugar de copiarse página a página, de modo que añadir una traducción actualiza los enlaces recíprocos de todas sus hermanas sin tocarlas una a una.

Paginación: cada página se sostiene sola

Un listado largo se trocea con paginate, como viste en el nivel de rutas, y cada página recibe su prop page. La duda recurrente es qué canónica darle a la página 2, 3, 4. La tentación es apuntarlas todas a la página 1 para “concentrar” la autoridad, y es un error: colapsar las páginas contra la primera esconde del índice el contenido que sólo aparece a partir de la segunda. El consenso moderno es que cada página paginada sea autorreferente e indexable: la página 2 es canónica de sí misma, no de la 1.

---
export async function getStaticPaths({ paginate }) {
  const posts = await getCollection('blog');
  return paginate(posts, { pageSize: 10 });
}
const { page } = Astro.props;
const canonical = new URL(Astro.url.pathname, Astro.site);
---
<SEO
  title={`Blog · página ${page.currentPage} de ${page.lastPage}`}
  description="Artículos de la guía"
  canonical={canonical}
/>

Dar a cada página un título que incluya su número la hace única y evita que el buscador las vea como duplicados. Los antiguos <link rel="next"> y <link rel="prev"> ya no son señales de indexación para el buscador principal —se retiraron hace años—, así que la discoverabilidad recae en los enlaces de navegación reales entre páginas: mientras la página 3 sea alcanzable con un enlace rastreable desde la 2, el buscador llegará a ella. La paginación deja de ser un problema de SEO en cuanto la tratas como lo que es: un conjunto de páginas hermanas, cada una legítima, enlazadas entre sí.

Dos patrones de listado exigen cuidado extra. El scroll infinito carga las páginas siguientes con JavaScript al llegar al fondo, y si ese contenido no existe en el HTML ni tiene URLs rastreables detrás, el buscador nunca lo ve: la mejora de experiencia se paga en invisibilidad. La cura es respaldar el scroll infinito con paginación real —enlaces a URLs que sí existen— para que humanos y rastreadores lleguen al mismo contenido por caminos distintos. Y si el listado no es gigantesco, una página ver todo bien enlazada a veces indexa mejor que la serie troceada, porque concentra el contenido en una sola URL fuerte en lugar de repartirlo entre muchas débiles.

📝
La canónica entre dominios también existe

La canónica no se limita a tu propio sitio: puede apuntar a una URL de otro dominio. Es la herramienta del contenido sindicado —un artículo que republicas en un medio ajeno— donde declaras que el original vive en otra parte y le cedes las señales. Úsala con conciencia: una canónica hacia fuera regala a otro dominio la autoridad de esa página, lo que es correcto cuando el original de verdad no es tuyo, y un disparo en el pie cuando sí lo es.

flowchart TD
URL[una URL llega al buscador] --> Q1{se debe rastrear}
Q1 -->|no| DIS[Disallow en robots txt]
Q1 -->|si| Q2{se debe indexar}
Q2 -->|no| NI[meta robots noindex]
Q2 -->|si| Q3{hay duplicados}
Q3 -->|si| CAN[link canonical a la version limpia]
Q3 -->|no| IDX[indexable y autorreferente]
style NI fill:#f9e2af,color:#11111b
style CAN fill:#89b4fa,color:#11111b
style IDX fill:#a6e3a1,color:#11111b
ℹ️
El presupuesto de rastreo importa cuando el sitio es grande

En un sitio de decenas de páginas, el buscador rastrea todo sin esfuerzo y el presupuesto de rastreo es una preocupación teórica. Empieza a importar en sitios de cientos de miles de URLs, donde el rastreador dedica un tiempo limitado y cada URL basura —una faceta de filtro combinatoria, un calendario infinito— le roba atención a las páginas valiosas. Ahí robots.txt gana su papel real: no des-indexar, sino evitar que el rastreador se pierda en laberintos que no aportan.

El índice es un conjunto curado, no un vertedero

La lección más difícil de aceptar del SEO técnico es que más páginas indexadas no es mejor. El instinto dice lo contrario: si publicar una página buena ayuda, publicar mil parece que ayudaría mil veces más. Pero el índice de un buscador no es un almacén donde acumular, sino una biblioteca que el buscador evalúa como un todo, y un sitio que inunda el índice con miles de variantes delgadas, filtradas y casi idénticas no comunica abundancia, comunica falta de criterio. La calidad percibida de tu dominio es un promedio, y cada página pobre que dejas entrar lo baja. Por eso el trabajo que has hecho aquí —decidir qué se rastrea, qué se indexa, qué se consolida contra qué— no es fontanería menor, sino el acto editorial central: estás curando el subconjunto de tu sitio que merece ser encontrado. Un sitio no es el conjunto de todas las URLs que puede generar, sino el conjunto mucho más pequeño que elige exponer, y esa elección es una declaración sobre qué considera valioso. Las herramientas que dominas ahora —el noindex que excluye, la canónica que consolida, la paginación que legitima cada página— son los instrumentos de esa curaduría. Y la disciplina que exigen es contraintuitiva: en un medio que premia producir sin límite, el SEO maduro consiste tanto en decidir qué esconder como en decidir qué mostrar. La restricción, aquí como en tantas partes de la ingeniería, no es lo contrario de la calidad; es su condición.

⚔️ Gobierna tu índice con intención
  1. Añade noindex a una página de agradecimiento pasando la prop a <SEO /> y verifica en el HTML que sale la <meta name="robots" content="noindex, nofollow">.
  2. Da a una página con parámetros de filtro una canónica derivada de Astro.url.pathname, e inspecciona que ignora el querystring y apunta a la ruta limpia.
  3. Pagina un listado con paginate, da a cada página un título con su número y una canónica autorreferente, y comprueba que la página 2 no colapsa contra la 1.
  4. Explica con tus palabras por qué poner a la vez Disallow y noindex sobre la misma URL puede dejarla indexada, y en qué orden aplicarías ambos para purgarla de verdad.