Parte 19 de 22

Paginación y navegación por facetas sin inflar el índice

Paginación y navegación por facetas sin inflar el índice

Los listados de categoría, los archivos del blog y las vistas filtradas generan más URL que todo el resto del sitio junto, y la mayoría no debería indexarse. Aquí muere el crawl budget y aquí nacen de verdad los problemas de duplicación. El objetivo: que el rastreador llegue a cada producto/entrada y que las permutaciones basura de URL se queden fuera del índice.

Paginación: URL reales, canonical a sí misma

  • Cada página recibe una URL real y enlazable: /blog/page/2 o ?page=2. La página 2 debe existir como HTML que el rastreador pueda pedir.
  • Cada página se canonicaliza a sí misma, no a la página 1. Un canonical de la página 2 a la página 1 le dice a Google "la página 2 es un duplicado", y todo lo enlazado solo desde las páginas 2+ cae en silencio del descubrimiento. Sigue siendo el error de paginación más común.
  • Google retiró rel="prev/next" en 2019: ahora cuentan los enlaces <a href> normales entre páginas (los enlaces numerados llevan al rastreador a las páginas profundas más rápido que una cadena de "solo siguiente").
  • Los títulos deben diferir: añada "— Página 2" para no multiplicar títulos duplicados.

En Next.js, las páginas basadas en rutas pueden ser totalmente estáticas:

// app/blog/page/[num]/page.tsx
export async function generateStaticParams() {
  const pages = Math.ceil((await getPostCount()) / PAGE_SIZE);
  return Array.from({ length: pages - 1 }, (_, i) => ({ num: String(i + 2) }));
}

Scroll infinito: junto con páginas reales

"Mostrar más" y la lista infinita son mecánicas de cliente, y los rastreadores no hacen scroll. Un patrón sólido: mantenga las URL paginadas como esqueleto rastreable, actualice la barra de direcciones con la History API a medida que se hace scroll (/page/3 cuando el usuario llega al tercer bloque) y haga que cada una de esas URL, al entrar directamente, renderice su bloque en el servidor. El usuario recibe un feed fluido; el rastreador, páginas.

Facetas: explosión combinatoria

Una categoría con 6 filtros de 10 valores da millones de permutaciones de URL. Divida las facetas en tres niveles:

  1. Dignas de índice: combinaciones con demanda real y un surtido estable ("zapatillas de running rojas", "pisos con balcón en Madrid"). Dé a estas rutas estáticas limpias (/running-shoes/red), títulos e introducciones únicos, canonical a sí mismas y un lugar en el sitemap. En la práctica son páginas de SEO programmatic: aplique el mismo umbral de valor único.
  2. Útiles pero no indexables: ordenaciones, deslizadores de precio, multiselectores. Déjelos como query params, robots: { index: false, follow: true }, canonical a la categoría base.
  3. Trampas de rastreo: parámetros de sesión, combinaciones infinitas de calendarios y fechas. Bloquee en robots.txt para que no consuman crawl budget (noindex exige rastrear cada URL para ser advertido).

No permita nunca que los filtros generen enlaces por los que el rastreador entre en el nivel 3: renderice esos controles como botones/formularios, no como <a href>.

Checklist:

  • Páginas de paginación: URL reales, canonical a sí mismas, enlaces <a> numerados, títulos distintos
  • Cero canonicals a la página 1; nada es accesible solo por scroll infinito
  • Facetas divididas en niveles: indexables / noindex,follow / bloqueadas en robots
  • Las combinaciones dignas de índice reciben rutas estáticas, contenido único y entradas en el sitemap
  • Los parámetros trampa nunca se renderizan como enlaces <a href> rastreables

¿Prefiere que se lo haga otra persona?

Audito y corrijo el SEO técnico de webs en Next.js: indexación, velocidad, hreflang y visibilidad en IA.

Servicio de SEO técnico