Deel 19 van 22

Paginatie en gefacetteerde navigatie zonder een opgeblazen index

Paginatie en gefacetteerde navigatie zonder een opgeblazen index

Categorieoverzichten, blogarchieven en gefilterde weergaven genereren meer URL's dan de rest van de site bij elkaar, en de meeste daarvan horen niet geïndexeerd te worden. Hier sterft het crawlbudget en hier ontstaan de echte duplicatieproblemen. Het doel: de crawler bereikt elk product/bericht en de rommelige URL-permutaties blijven buiten de index.

Paginatie: echte URL's, canonical naar zichzelf

  • Elke pagina krijgt een echte, linkbare URL: /blog/page/2 of ?page=2. Pagina 2 moet bestaan als HTML die de crawler kan opvragen.
  • Elke pagina canoniseert naar zichzelf, niet naar pagina 1. Een canonical van pagina 2 naar pagina 1 zegt tegen Google "pagina 2 is een duplicaat", en alles wat alleen vanaf pagina 2+ gelinkt wordt, valt stilletjes uit de ontdekking. Dit is nog steeds de meestvoorkomende paginatiefout.
  • rel="prev/next" heeft Google in 2019 ingetrokken: nu tellen gewone <a href>-links tussen pagina's (genummerde links brengen de crawler sneller bij diepe pagina's dan een keten met alleen "volgende").
  • Titels moeten verschillen: voeg "— Pagina 2" toe om geen dubbele titels te vermenigvuldigen.

In Next.js kunnen padgebaseerde pagina's volledig statisch zijn:

// 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) }));
}

Infinite scroll: samen met echte pagina's

"Toon meer" en een oneindige lijst zijn clientmechanismen, en crawlers scrollen niet. Een solide patroon: houd gepagineerde URL's als crawlbaar skelet, werk de adresbalk bij via de History API terwijl er wordt gescrold (/page/3 zodra de gebruiker bij het derde blok komt) en laat elke zo'n URL bij direct bezoek zijn eigen blok op de server renderen. De gebruiker krijgt een soepele feed, de crawler krijgt pagina's.

Facetten: combinatorische explosie

Een categorie met 6 filters van elk 10 waarden geeft miljoenen URL-permutaties. Verdeel facetten over drie niveaus:

  1. Het indexeren waard: combinaties met echte vraag en een stabiel assortiment ("rode hardloopschoenen", "appartementen met balkon in Amsterdam"). Geef ze schone statische paden (/running-shoes/red), unieke titels en inleidingen, een canonical naar zichzelf en een plek in de sitemap. Dit zijn in feite programmatic SEO-pagina's: pas dezelfde drempel van unieke waarde toe.
  2. Bruikbaar, maar niet indexeerbaar: sorteringen, prijsschuiven, multiselects. Laat ze als queryparameters staan, robots: { index: false, follow: true }, canonical naar de basiscategorie.
  3. Crawlvallen: sessieparameters, oneindige combinaties van kalenders en datums. Blokkeer in robots.txt zodat ze het crawlbudget helemaal niet opeten (noindex vereist dat elke URL wordt gecrawld om opgemerkt te worden).

Laat filters nooit links genereren waarmee de crawler niveau 3 binnenkomt: render die controls als knoppen/formulieren, niet als <a href>.

Checklist:

  • Paginatiepagina's: echte URL's, canonical naar zichzelf, genummerde <a>-links, verschillende titels
  • Geen canonicals naar pagina 1; niets is uitsluitend bereikbaar via infinite scroll
  • Facetten verdeeld in niveaus: indexeerbaar / noindex,follow / geblokkeerd in robots
  • Combinaties die indexering waard zijn krijgen statische paden, unieke content en sitemapvermeldingen
  • Valstrikparameters worden nooit als crawlbare <a href>-links gerenderd

Laat je dit liever door iemand anders doen?

Ik audit en herstel technische SEO op Next.js-websites — indexering, snelheid, hreflang en zichtbaarheid in AI-zoekmachines.

Dienst technische SEO