Guide til Next.js SEO: velg SSG, SSR eller ISR, sett metadata og canonicals, generer sitemap.xml, driv en blogg som mates via webhook, og hold siden lesbar for AI-crawlere.

På denne siden
Kort fortalt
Next.js er et av de beste React-rammeverkene for SEO, fordi det sender komplett HTML til crawlere i stedet for et tomt skall. For å rangeres bør du forhåndsgjengi innholdssider (statisk generering eller ISR), definere titler, beskrivelser og canonicals med Metadata API-et, generere sitemap.xml og robots.txt fra app-mappen, bruke ekte lenker og riktige statuskoder, og holde hovedinnholdet utenfor kode som bare kjører på klienten, fordi de fleste AI-crawlere ikke kjører JavaScript.
Vil du vite mer? Spør
Rask quiz
Passer SEO for deg, og hvordan bør du starte?
Sorank passer til svarene dine
Prøv det i 3 dager på ditt eget nettsted, og se hvor du står på Google, ChatGPT og de andre AI-assistentene.
Start en gratis prøveperiode på 3 dager3 dager gratis, deretter kan du stoppe når du vil. Resultatgaranti i 90 dager, ellers pengene tilbake.
Next.js SEO handler mest om å gjøre riktig valg per rute: hva som gjengis på serveren, hva som mellomlagres, og hva som havner i HTML-en før noe skript kjører. Google forklarer i grunnleggende om JavaScript-SEO at de behandler JavaScript-apper i tre faser (gjennomsøking, gjengivelse og indeksering), og at «serverside- eller forhåndsgjengivelse fortsatt er en god idé». Next.js gjør det som standard. Denne guiden dekker App Router (Next.js 13 og nyere), med merknader for den eldre Pages Router.
Ja. En vanlig React-app med gjengivelse på klienten sender en nesten tom HTML-fil og bygger siden i nettleseren. Søkemotorene må gjengi den, og mange roboter gjør aldri det. Next.js gjengir React på serveren, slik at HTML-svaret allerede inneholder overskriftene, teksten, lenkene og metadataene. Vår guide til JavaScript-SEO forklarer hvorfor den forskjellen betyr noe for indekseringen.
I App Router er komponentene Server Components som standard. Selv komponenter merket med 'use client' forhåndsgjengis til HTML på serveren. Det svake punktet er data: alt du henter inne i useEffect, eller som først lastes etter et klikk, mangler i den første HTML-en. Hent innhold i Server Components, og bruk klientkomponenter bare til interaktivitet.
Next.js lar deg blande modusene rute for rute. Valget påvirker hvor oppdatert innholdet er, hastigheten og hva crawlerne får.
| Modus | Når HTML-en bygges | SEO-vurdering | Passer til |
|---|---|---|---|
| Statisk generering (SSG) | Under bygging | Best: full HTML, svært raskt | Landingssider, dokumentasjon, tidløse artikler |
| Incremental Static Regeneration (ISR) | Under bygging, deretter oppdatert i bakgrunnen eller på forespørsel | Best for store eller endrede nettsteder | Blogger, produktkataloger, CMS-sider |
| Serverside-gjengivelse (SSR) | Ved hver forespørsel | God: full HTML, avhenger av serverhastigheten | Personaliserte eller sanntidssider |
| Gjengivelse på klienten (CSR) | I nettleseren | Svak: innholdet er usynlig for de fleste roboter | Dashbord bak innlogging |
Dokumentasjonen for ISR i Next.js lister fordelene: oppdatere statisk innhold «uten å bygge hele nettstedet på nytt» og håndtere store mengder sider uten lange byggetider. En rute med export const revalidate = 3600 blir generert på nytt høyst én gang i timen. For nøyaktig kontroll kaller du revalidatePath eller revalidateTag når innholdet endres. ISR fungerer ikke med en statisk eksport (output: 'export'). For apper som må være gjengitt på klienten, dekker vår guide til SEO for enkeltsideapplikasjoner omveiene.
Tips
Kontroller hva robotene får, ikke hva nettleseren din viser: kjør curl på URL-en, eller åpne view-source og søk etter en setning fra artikkelen. Hvis den ikke finnes i den rå HTML-en, avhenger den av JavaScript.
Metadata API-et erstatter next/head i App Router. Ifølge dokumentasjonen for metadata i Next.js eksporterer du et statisk metadata-objekt fra en layout eller side, eller en generateMetadata-funksjon når verdiene avhenger av data, og Next.js genererer tagene i head. Begge deler støttes bare i 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] },
}
}Fem regler som forhindrer de fleste problemene:
På dynamiske sider sender Next.js metadataene som strøm etter de første bytene for å øke gjengivelsestempoet. Dokumentasjonen sier at strømming er slått av for roboter som forventer metadata i head, oppdaget via user agent (Bingbot, Twitterbot og Slackbot er blant eksemplene), og at alternativet htmlLimitedBots tilpasser listen. Hvis du bryr deg om en crawler som ikke er dekket, legg den til. I Pages Router er tilsvarende Head-komponenten fra next/head, med et key-attributt for å unngå dupliserte tagger.
Begge er spesialfiler i app-mappen. En sitemap.ts-fil som eksporterer en funksjon som returnerer URL-er, blir til /sitemap.xml, og en robots.ts-fil blir til /robots.txt. referansen for sitemap forklarer at filen mellomlagres som standard, og at Googles grense er 50 000 URL-er per sitemap. Over det deler generateSitemaps listen opp i flere filer.
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,
}))
}Ta bare med kanoniske, indekserbare URL-er som returnerer 200, og bruk den faktiske oppdateringsdatoen i lastModified. Sitemapet støtter også alternates.languages for flerspråklige nettsteder. I robots.ts peker du til sitemapet og bestemmer hvilke AI-roboter som får gjennomsøke nettstedet. Vår artikkel om robots.txt for AI-crawlere lister dem opp. Mer om formatet finner du i leksikonoppslaget om XML-sitemap.
| Problem | Hva som skjer | Løsning |
|---|---|---|
| Navigasjon med onClick og router.push | Google følger bare a-elementer med href | Bruk Link-komponenten fra next/link, som gjengir en ekte lenke |
| Manglende innhold gjengitt som en side med 200 | Myk 404 i Search Console | Kall notFound(), slik at ruten returnerer statuskode 404 |
| Midlertidige omdirigeringer for flyttede sider | redirect() sender 307 | Bruk permanentRedirect() eller permanent: true i next.config (308) |
| Blandede skråstreker på slutten | To URL-er for samme side | Velg én med alternativet trailingSlash, og hold canonicals konsistente |
| Forhåndsvisnings- eller testmiljøer som indekseres | Dupliserte kopier av nettstedet i Google | Send noindex på domener som ikke er produksjon |
| Innhold bak faner som lastes ved klikk | Teksten mangler i HTML-en | Gjengi alt innhold på serveren, og skjul det med CSS om nødvendig |
Alle disse problemene svekker gjennomsøkbarheten: en crawler må kunne oppdage hver URL via lenker og få en ren statuskode.
Dokumentasjonen for Next.js anbefaler å gjengi JSON-LD som et script-element av typen application/ld+json direkte i side- eller layoutkomponenten, bygget fra de samme dataene som siden, og å escape tegnet < i den serialiserte JSON-en for å hindre injeksjon. Fordi det gjengis på serveren, ser både Google og AI-crawlere det i den rå HTML-en. Bruk Article (eller BlogPosting) for innlegg, Organization i rotlayouten, BreadcrumbList for dype sider og Product for netthandel. En skjemagenerator gir deg en gyldig startblokk, og deretter validerer du siden med Googles Rich Results Test.
Next.js leverer komponentene som håndterer de vanlige årsakene til dårlige Core Web Vitals:
Mål feltdata, ikke bare en laboratoriescore: vår guide til PageSpeed Insights viser hvordan du leser begge.
En Next.js-blogg har vanligvis én av tre former: MDX- eller Markdown-filer i repositoriet (enkelt, men hvert innlegg krever en commit og en utrulling), et headless CMS (Sanity, Contentful, Strapi, Payload) som hentes i Server Components, eller en publiseringswebhook som mottar artikler fra et eksternt verktøy. I alle tre tilfellene er SEO-mønsteret det samme: en dynamisk rute app/blog/[slug] med generateStaticParams, generateMetadata, ISR, sitemapet matet fra samme kilde, og en indeksside som lenker til hvert innlegg.
Webhook-mønsteret holder publiseringen utenfor utrullingssyklusen din. En Route Handler mottar artikkelen, lagrer den og validerer deretter de berørte sidene på nytt:
// 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 })
}Vær oppmerksom
Beskytt endepunktet med en hemmelighet, og valider den nøyaktige offentlige stien på nytt. Dokumentasjonen for ISR advarer om at med flere serverforekomster og standard filmellomlager, tømmer validering på forespørsel bare forekomsten som mottar kallet. Bruk en delt mellomlagerbehandler.
Serverside-gjengivelse er første vilkår for GEO (generativ søkemotoroptimalisering). Vercels analyse fra desember 2024, Fremveksten av AI-crawlere, fant at «ingen av de store AI-crawlerne for øyeblikket gjengir JavaScript», og nevner GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot og PerplexityBot. Den telte også 569 millioner GPTBot-hentinger og 370 millioner Claude-hentinger i nettverket sitt på én måned. En Next.js-side som forhåndsgjengir teksten, overskriftene og JSON-LD-en sin, kan leses av alle disse, mens en klientgjengitt side ikke kan det.
Det andre vilkåret er innhold som er verdt å sitere: artikler som svarer på ett spørsmål per avsnitt, med kilder, tall og tydelige definisjoner, publisert jevnlig. Det er delen Sorank, vårt produkt, automatiserer. Sorank er en SEO- og GEO-programvare som kjører på autopilot: den finner søkeordene dine, og generatoren for blogartikler skriver 20, 60 eller 120 artikler i måneden med kilder, interne lenker og bilder. På et Next.js-nettsted kobles den til via den egendefinerte webhooken som beskrives på installasjonssiden: Route Handler-en din mottar hver artikkel, lagrer den og validerer bloggen på nytt. Sporing av AI-omtaler sjekker deretter hver måned om ChatGPT, Claude og Gemini siterer merkevaren din.

Den korte versjonen: forhåndsgjengi alle sider du vil bli funnet på, definer metadata på serveren, og mat sitemapet fra samme kilde som innholdet. Next.js gir deg verktøyene; rangeringer og AI-sitater kommer av det du publiserer med dem. For å holde en Next.js-blogg forsynt med artikler, se prisene til Sorank, fra $49 per måned med en gratis prøveperiode på 3 dager.
Next.js er bygget på React, så sammenligningen gjelder gjengivelsesmetodene. En standard React-SPA gjengis i nettleseren og sender nesten tom HTML, mens Next.js forhåndsgjengir sidene på serveren eller under bygging. Crawlere, også AI-roboter som ikke kjører JavaScript, får komplett innhold fra Next.js uten ekstra oppsett.
Ikke av seg selv. I App Router legger du en sitemap.ts-fil i app-mappen som returnerer URL-ene dine, og Next.js serverer den på /sitemap.xml. For store nettsteder deler generateSitemaps listen opp i flere filer, siden Google godtar opptil 50 000 URL-er per sitemap.
Begge kan rangeres godt, fordi begge forhåndsgjengir HTML. App Router er det anbefalte valget for nye prosjekter: Server Components reduserer JavaScript på klienten, og Metadata API-et, sitemap.ts og robots.ts håndterer SEO-filene direkte. På et eksisterende nettsted med Pages Router er en migrering sjelden verdt det bare for SEO.
DE PRØVDE SORANK FØR DEG
