Next.js SEO-gids: kies SSG, SSR of ISR, stel metadata en canonicals in, genereer sitemap.xml, vul een blog via een webhook en blijf leesbaar voor AI-crawlers.

Vat dit artikel samen met AI
Korte quiz
Is SEO iets voor jou, en hoe begin je?
4 korte vragen om te zien of Google je klanten kan opleveren.
Ons advies voor jou
Sorank is de juiste oplossing voor u
Mensen zoeken naar wat je verkoopt en je kunt een paar maanden wachten: Sorank vindt de juiste zoekopdrachten, schrijft en publiceert de artikelen en zorgt voor links.
Sorank past bij je antwoorden
Test het 3 dagen op je eigen website, of begin met een gratis audit om te zien waar je staat.
3 dagen gratis, daarna stop je wanneer je wilt. 90 dagen geld-terug-garantie.
Kort gezegd: Next.js is een van de beste React-frameworks voor SEO, omdat het crawlers volledige HTML stuurt in plaats van een lege schil. Wilt u goed scoren, prerender dan contentpagina's (statische generatie of ISR), definieer titels, beschrijvingen en canonicals met de Metadata API, genereer sitemap.xml en robots.txt vanuit de app-map, gebruik echte links en correcte statuscodes, en houd de belangrijkste content buiten code die alleen in de browser draait, want de meeste AI-crawlers voeren geen JavaScript uit.
Bij Next.js SEO draait het vooral om de juiste keuze per route: wat wordt op de server gerenderd, wat wordt gecachet en wat staat in de HTML voordat er ook maar één script draait. Google legt in de basisprincipes van JavaScript-SEO uit dat JavaScript-apps in drie fasen worden verwerkt (crawlen, renderen, indexeren) en dat server-side rendering of prerendering "nog steeds een goed idee" is. Next.js doet dat standaard. Deze gids behandelt de App Router (Next.js 13 en hoger), met opmerkingen over de oudere Pages Router.
Ja. Een gewone React-app met client-side rendering stuurt een bijna leeg HTML-bestand en bouwt de pagina in de browser op; zoekmachines moeten die renderen, en veel bots doen dat nooit. Next.js rendert React op de server, dus de HTML-respons bevat al koppen, tekst, links en metadata. Onze gids over JavaScript-SEO legt uit waarom dat verschil telt voor indexering.
In de App Router zijn componenten standaard Server Components. Zelfs componenten met 'use client' worden op de server naar HTML geprerenderd. Het zwakke punt is data: alles wat u in useEffect ophaalt, of pas na een klik laadt, ontbreekt in de initiële HTML. Haal content op in Server Components en gebruik clientcomponenten alleen voor interactiviteit.
Met Next.js kunt u modi per route combineren. De keuze bepaalt actualiteit, snelheid en wat crawlers ontvangen.
| Modus | Wanneer de HTML ontstaat | SEO-oordeel | Geschikt voor |
|---|---|---|---|
| Statische generatie (SSG) | Tijdens de build | Beste: volledige HTML, zeer snel | Landingspagina's, documentatie, tijdloze artikelen |
| Incremental Static Regeneration (ISR) | Tijdens de build, daarna op de achtergrond of op aanvraag ververst | Beste voor grote of veranderende sites | Blogs, productcatalogi, CMS-pagina's |
| Server-side rendering (SSR) | Bij elk verzoek | Goed: volledige HTML, afhankelijk van serversnelheid | Gepersonaliseerde of realtime pagina's |
| Client-side rendering (CSR) | In de browser | Zwak: content onzichtbaar voor de meeste bots | Dashboards achter een login |
De Next.js-documentatie over ISR noemt de voordelen: statische content bijwerken "zonder de hele site opnieuw te bouwen" en grote aantallen pagina's beheren zonder lange buildtijden. Een route met export const revalidate = 3600 wordt hooguit eens per uur opnieuw gegenereerd; voor exacte controle roept u revalidatePath of revalidateTag aan wanneer content verandert. ISR werkt niet met een statische export (output: 'export'). Voor apps die client-side gerenderd moeten blijven, beschrijft onze gids over SEO voor single page applications de oplossingen.
Tip
Controleer wat bots ontvangen, niet wat uw browser toont: voer curl uit op de URL of open view-source en zoek een zin uit het artikel. Staat die niet in de ruwe HTML, dan hangt hij af van JavaScript.
De Metadata API vervangt next/head in de App Router. Volgens de Next.js-documentatie over metadata exporteert u een statisch metadata-object uit een layout of pagina, of een functie generateMetadata als de waarden van data afhangen, en Next.js genereert de head-tags. Beide worden alleen ondersteund in Server Components.
export async function generateMetadata({ params }) {
const { slug } = await params
const post = await getPost(slug)
return {
title: post.title,
description: post.excerpt,
alternates: { canonical: `/blog/${slug}` },
openGraph: { images: [post.cover] },
}
}Vijf regels die de meeste problemen voorkomen:
Op dynamische pagina's streamt Next.js de metadata na de eerste bytes om het renderen te versnellen. Volgens de documentatie is streaming uitgeschakeld voor bots die metadata in de head verwachten, herkend aan de user agent (Bingbot, Twitterbot en Slackbot staan bij de voorbeelden), en past de optie htmlLimitedBots de lijst aan. Ontbreekt een crawler die voor u belangrijk is, voeg hem dan toe. In de Pages Router is het equivalent de Head-component uit next/head, met een key-attribuut tegen dubbele tags.
Beide zijn speciale bestanden in de app-map. Een bestand sitemap.ts dat een functie met URL's exporteert, wordt /sitemap.xml; een bestand robots.ts wordt /robots.txt. De sitemapreferentie vermeldt dat het bestand standaard wordt gecachet en dat de limiet van Google 50.000 URL's per sitemap is; daarboven splitst generateSitemaps het in meerdere bestanden.
import type { MetadataRoute } from 'next'
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const posts = await getPosts()
return posts.map((p) => ({
url: `https://example.com/blog/${p.slug}`,
lastModified: p.updatedAt,
}))
}Neem alleen canonieke, indexeerbare URL's op die 200 teruggeven, met de echte wijzigingsdatum in lastModified. De sitemap accepteert ook alternates.languages voor meertalige sites. Verwijs in robots.ts naar de sitemap en bepaal welke AI-bots mogen crawlen; ons artikel over robots.txt voor AI-crawlers zet ze op een rij. Meer over het formaat in onze woordenlijst over de XML-sitemap.
| Probleem | Wat er gebeurt | Oplossing |
|---|---|---|
| Navigatie met onClick en router.push | Google volgt alleen a-elementen met een href | De Link-component uit next/link gebruiken, die een echte link oplevert |
| Ontbrekende content als pagina met status 200 | "Soft 404" in Search Console | notFound() aanroepen zodat de route status 404 teruggeeft |
| Tijdelijke redirects voor verplaatste pagina's | redirect() stuurt een 307 | permanentRedirect() of permanent: true in next.config gebruiken (308) |
| Gemengde slashes aan het eind | Twee URL's voor dezelfde pagina | Eén variant kiezen met de optie trailingSlash en canonicals consistent houden |
| Geïndexeerde preview- of stagingomgevingen | Dubbele kopieën van de site in Google | noindex sturen op niet-productiedomeinen |
| Tabbladcontent die pas bij een klik laadt | Tekst ontbreekt in de HTML | Alle content op de server renderen en zo nodig met CSS verbergen |
Al deze problemen verminderen de crawlbaarheid: een crawler moet elke URL via links kunnen vinden en een schone statuscode krijgen.
De Next.js-documentatie raadt aan JSON-LD als script-tag van het type application/ld+json direct in de pagina- of layoutcomponent te renderen, op basis van dezelfde data als de pagina, en het teken < in de geserialiseerde JSON te escapen om injectie te voorkomen. Omdat het op de server wordt gerenderd, zien Google en AI-crawlers het in de ruwe HTML. Gebruik Article (of BlogPosting) voor berichten, Organization in de root-layout, BreadcrumbList voor diepe pagina's en Product voor e-commerce. Een schema-generator geeft u een geldig startblok; valideer de pagina daarna met de test voor uitgebreide resultaten van Google.
Next.js levert componenten die de gebruikelijke oorzaken van slechte Core Web Vitals aanpakken:
Meet velddata, niet alleen een labscore: onze gids over PageSpeed Insights laat zien hoe u beide leest.
Een Next.js-blog heeft meestal een van drie vormen: MDX- of Markdown-bestanden in de repository (eenvoudig, maar elk bericht vraagt een commit en een deploy), een headless CMS (Sanity, Contentful, Strapi, Payload) dat in Server Components wordt opgevraagd, of een publicatiewebhook die artikelen van een externe tool ontvangt. In alle drie de gevallen is het SEO-patroon gelijk: een dynamische route app/blog/[slug] met generateStaticParams, generateMetadata, ISR, een sitemap uit dezelfde bron en een overzichtspagina die naar elk bericht linkt.
De webhook haalt publiceren uit de deploycyclus. Een Route Handler ontvangt het artikel, slaat het op en revalideert daarna de betreffende pagina's:
// app/api/publish/route.ts
import { revalidatePath } from 'next/cache'
export async function POST(request) {
if (request.headers.get('authorization') !== `Bearer ${process.env.PUBLISH_SECRET}`) {
return new Response('Unauthorized', { status: 401 })
}
const article = await request.json()
await savePost(article)
revalidatePath('/blog')
revalidatePath(`/blog/${article.slug}`)
return Response.json({ ok: true })
}Let op
Beveilig het endpoint met een geheim en revalideer het exacte publieke pad. De ISR-documentatie waarschuwt dat bij meerdere serverinstanties en de standaard bestandscache revalidatie op aanvraag alleen de instantie leegt die de aanroep ontvangt; gebruik een gedeelde cachehandler.
Server-side rendering is de eerste voorwaarde voor GEO (generative engine optimization). De analyse van Vercel uit december 2024, The rise of the AI crawler, stelde vast dat "geen van de grote AI-crawlers momenteel JavaScript rendert", noemde GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot en PerplexityBot, en telde in één maand 569 miljoen opvragingen door GPTBot en 370 miljoen door Claude op het eigen netwerk. Een Next.js-pagina die tekst, koppen en JSON-LD prerendert, is voor allemaal leesbaar; een client-side gerenderde pagina niet.
De tweede voorwaarde is content die het citeren waard is: artikelen die per sectie één vraag beantwoorden, met bronnen, cijfers en heldere definities, regelmatig gepubliceerd. Dat deel automatiseert Sorank, ons product. Sorank is SEO- en GEO-software op autopilot: het vindt uw zoekwoorden, en de Blogartikelgenerator schrijft 20, 60 of 120 artikelen per maand met bronnen, interne links en afbeeldingen. Op een Next.js-site koppelt het via de aangepaste webhook die op de installatiepagina staat beschreven: uw Route Handler ontvangt elk artikel, slaat het op en revalideert de blog. AI-vermeldingstracking controleert daarna elke week of ChatGPT, Claude en Gemini uw merk citeren.

Samengevat: prerender elke pagina die gevonden moet worden, definieer metadata op de server en voed de sitemap uit dezelfde bron als de content. Next.js levert het gereedschap; posities en AI-citaties komen voort uit wat u ermee publiceert. Om een Next.js-blog doorlopend van artikelen te voorzien, bekijk de abonnementen van Sorank, vanaf 49 € per maand met 3 dagen gratis proberen.
Next.js is gebouwd op React, dus de vergelijking gaat over de manier van renderen. Een standaard React-single-page-app rendert in de browser en stuurt bijna lege HTML, terwijl Next.js pagina's op de server of tijdens de build prerendert. Crawlers, ook AI-bots die geen JavaScript uitvoeren, krijgen met Next.js zonder extra instellingen de volledige content.
Niet uit zichzelf. In de App Router voegt u aan de app-map een bestand sitemap.ts toe dat uw URL's teruggeeft, en Next.js serveert het op /sitemap.xml. Bij grote sites verdeelt generateSitemaps de lijst over meerdere bestanden, omdat Google maximaal 50.000 URL's per sitemap accepteert.
Beide kunnen goed scoren, omdat beide HTML prerenderen. De App Router is de aanbevolen keuze voor nieuwe projecten: Server Components verminderen client-JavaScript, en de Metadata API, sitemap.ts en robots.ts regelen SEO-bestanden standaard. Bij een bestaande Pages Router-site loont een migratie zelden alleen voor SEO.
ZIJ PROBEERDEN SORANK VOOR JOU
