Next.js SEO-guide: vælg SSG, SSR eller ISR, sæt metadata og canonicals, generér sitemap.xml, kør en blog fødet via webhook, og hold siden læsbar for AI-crawlere.

På denne side
Kort fortalt
Next.js er et af de bedste React-frameworks til SEO, fordi det sender komplet HTML til crawlere i stedet for et tomt skal. For at rangere skal du prerendere indholdssider (statisk generering eller ISR), definere titler, beskrivelser og canonicals med Metadata API'et, generere sitemap.xml og robots.txt fra app-mappen, bruge rigtige links og korrekte statuskoder, og holde dit hovedindhold ude af kode, der kun kører i klienten, da de fleste AI-crawlere ikke kører JavaScript.
Vil du vide mere? Spørg
Hurtig quiz
Passer SEO til dig, og hvordan skal du starte?
Sorank matcher dine svar
Test det i 3 dage på dit eget site, og se, hvor du står på Google, ChatGPT og de andre AI'er.
Start prøveperiode på 3 dage3 dage gratis, derefter stopper du, når du vil. 90 dages garanti: resultater eller pengene tilbage.
Next.js SEO handler mest om at træffe det rigtige valg pr. route: hvad der renderes på serveren, hvad der caches, og hvad der når HTML'en, før et script kører. Google forklarer i sine grundlæggende principper for JavaScript-SEO, at det behandler JavaScript-apps i tre faser (crawling, rendering, indeksering), og at „server-side rendering eller prerendering stadig er en god idé“. Next.js gør det som standard. Denne guide dækker App Router (Next.js 13 og nyere), med noter til den ældre Pages Router.
Ja. En almindelig React-app bygget med rendering i klienten sender en næsten tom HTML-fil og bygger siden i browseren; søgemaskiner skal rendere den, og mange bots gør aldrig det. Next.js renderer React på serveren, så HTML-svaret allerede indeholder overskrifterne, teksten, links og metadata. Vores guide til JavaScript-SEO forklarer, hvorfor forskellen betyder noget for indekseringen.
I App Router er komponenter Server Components som standard. Selv komponenter markeret med 'use client' prerenderes til HTML på serveren. Det svage punkt er data: alt, du henter i useEffect, eller kun indlæser efter et klik, mangler i den første HTML. Hent indhold i Server Components, og behold klientkomponenter til interaktivitet.
Next.js lader dig blande metoderne route for route. Valget påvirker friskhed, hastighed og det, crawlere modtager.
| Metode | Hvornår HTML'en bygges | SEO-vurdering | Godt til |
|---|---|---|---|
| Statisk generering (SSG) | Ved bygning | Bedst: fuld HTML, meget hurtig | Landingssider, dokumentation, tidløse artikler |
| Incremental Static Regeneration (ISR) | Ved bygning, derefter opdateret i baggrunden eller efter behov | Bedst til store eller skiftende sites | Blogs, produktkataloger, CMS-sider |
| Server-side rendering (SSR) | Ved hver forespørgsel | God: fuld HTML, afhænger af serverens hastighed | Personlige eller realtidssider |
| Client-side rendering (CSR) | I browseren | Svag: indhold usynligt for de fleste bots | Dashboards bag login |
Next.js-dokumentationen for ISR beskriver fordelene: opdatér statisk indhold „uden at bygge hele sitet igen“ og håndtér store mængder sider uden lange byggetider. En route med export const revalidate = 3600 regenereres højst én gang i timen; for præcis styring kalder du revalidatePath eller revalidateTag, når indholdet ændres. Bemærk, at ISR ikke virker med en statisk eksport (output: 'export'). For apps, der skal forblive renderet i klienten, dækker vores guide til SEO for single page applications workarounds.
Tip
Kontrollér, hvad bots modtager, ikke hvad din browser viser: kør curl på URL'en, eller åbn view-source og søg efter en sætning fra artiklen. Hvis den ikke findes i den rå HTML, er den afhængig af JavaScript.
Metadata API'et erstatter next/head i App Router. Ifølge Next.js-dokumentationen for metadata eksporterer du et statisk metadata-objekt fra en layout eller side, eller en generateMetadata-funktion, når værdierne afhænger af data, og Next.js genererer head-tagsene. Begge understøttes kun 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, der forebygger de fleste problemer:
På dynamiske sider streamer Next.js metadata efter de første bytes for at fremskynde renderingen. Dokumentationen oplyser, at streaming er slået fra for bots, der forventer metadata i head'en, og at de registreres ud fra user agent (Bingbot, Twitterbot og Slackbot er blandt eksemplerne), og at indstillingen htmlLimitedBots tilpasser listen. Hvis du er afhængig af en crawler, der ikke er med, så tilføj den. I Pages Router svarer det til komponenten Head fra next/head, med en key-attribut for at undgå dublerede tags.
Begge er særlige filer i app-mappen. En sitemap.ts-fil, der eksporterer en funktion, som returnerer URL'er, bliver til /sitemap.xml; en robots.ts-fil bliver til /robots.txt. Sitemap-referencen oplyser, at filen caches som standard, og at Googles grænse er 50.000 URL'er pr. sitemap; over det deler generateSitemaps listen op 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,
}))
}Medtag kun canonical, indekserbare URL'er, der returnerer 200, og brug den rigtige opdateringsdato i lastModified. Sitemappet accepterer også alternates.languages til flersprogede sites. I robots.ts peger du på sitemappet og beslutter, hvilke AI-bots der må crawle sitet; vores artikel om robots.txt for AI-crawlere lister dem. Mere om formatet i vores ordbogsside om XML-sitemap.
| Problem | Hvad sker der | Løsning |
|---|---|---|
| Navigation med onClick og router.push | Google følger kun a-elementer med et href | Brug Link-komponenten fra next/link, som renderer et rigtigt link |
| Manglende indhold renderet som en side med 200 | Soft 404 i Search Console | Kald notFound(), så routen returnerer statuskoden 404 |
| Midlertidige omdirigeringer for flyttede sider | redirect() sender en 307 | Brug permanentRedirect() eller permanent: true i next.config (308) |
| Blandede afsluttende skråstreger | To URL'er for samme side | Vælg én med indstillingen trailingSlash, og hold canonicals konsistente |
| Preview- eller staging-udgivelser indekseret | Dubletter af sitet i Google | Send noindex på domæner, der ikke er produktion |
| Indhold bag faner, der indlæses ved klik | Teksten findes ikke i HTML'en | Render alt indhold på serveren, og skjul det med CSS om nødvendigt |
Disse problemer reducerer alle crawlbarheden: en crawler skal kunne opdage hver URL via links og få en ren statuskode.
Next.js-dokumentationen anbefaler at rendere JSON-LD som et script-tag af typen application/ld+json direkte i side- eller layoutkomponenten, bygget ud fra de samme data som siden, og at escape tegnet < i den serialiserede JSON for at forhindre injection. Fordi det renderes på serveren, ser både Google og AI-crawlere det i den rå HTML. Brug Article (eller BlogPosting) til artikler, Organization i root-layoutet, BreadcrumbList til dybe sider og Product til e-handel. En schema-generator giver dig en gyldig startblok, og derefter validerer du siden med Googles Rich Results Test.
Next.js leverer de komponenter, der håndterer de typiske årsager til dårlige Core Web Vitals:
Mål feltdata, ikke kun en laboratoriescore: vores guide til PageSpeed Insights viser, hvordan du læser begge dele.
En Next.js-blog tager typisk en af tre former: MDX- eller Markdown-filer i repositoryet (enkelt, men hvert indlæg kræver en commit og en udrulning), et headless CMS (Sanity, Contentful, Strapi, Payload) hentet i Server Components, eller en udgivelses-webhook, der modtager artikler fra et eksternt værktøj. I alle tre tilfælde er SEO-mønsteret det samme: en dynamisk route app/blog/[slug] med generateStaticParams, generateMetadata og ISR, sitemappet fødet fra samme kilde og en indeksside, der linker til alle indlæg.
Webhook-mønsteret holder udgivelsen uden for din udrulningscyklus. En Route Handler modtager artiklen, gemmer den og revaliderer de berørte sider:
// 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 })
}Pas på
Beskyt endpointet med en hemmelighed, og revalidér den præcise offentlige sti. ISR-dokumentationen advarer om, at med flere serverinstanser og standard filcachen rydder revalidering på forespørgsel kun den instans, der modtager kaldet; brug en delt cache-handler.
Server-rendering er den første betingelse for GEO (generativ motoroptimering). Vercels analyse fra december 2024, Fremkomsten af AI-crawlere, fandt, at „ingen af de største AI-crawlere i dag renderer JavaScript“, og nævnte GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot og PerplexityBot. Den målte også 569 millioner hentninger fra GPTBot og 370 millioner fra Claude på sit netværk på én måned. En Next.js-side, der prerenderer sin tekst, sine overskrifter og sin JSON-LD, kan læses af alle dem; en side renderet i klienten kan ikke.
Den anden betingelse er indhold, der er værd at citere: artikler, der besvarer ét spørgsmål pr. afsnit, med kilder, tal og klare definitioner, og som udgives regelmæssigt. Det er den del, som Sorank, vores produkt, automatiserer. Sorank er software, der kører på autopilot til SEO og GEO: den finder dine søgeord, og dens artikelgenerator til blog skriver 20, 60 eller 120 artikler om måneden med kilder, interne links og billeder. På et Next.js-site forbindes den via den brugerdefinerede webhook, der beskrives på installationssiden: din Route Handler modtager hver artikel, gemmer den og revaliderer bloggen. Overvågning af AI-omtaler tjekker derefter hver måned, om ChatGPT, Claude og Gemini citerer dit brand.

Den korte version: prerender hver side, du vil have fundet, definér metadata på serveren, og fød sitemappet fra samme kilde som indholdet. Next.js giver dig værktøjerne; rangeringer og AI-citater kommer fra det, du udgiver med dem. For at holde en Next.js-blog forsynet med artikler, se Soranks priser, fra 49 USD pr. måned med en gratis prøveperiode på 3 dage.
Next.js er bygget på React, så sammenligningen handler om renderingsmetoder. En almindelig React single page app renderes i browseren og sender næsten tom HTML, mens Next.js prerenderer sider på serveren eller ved bygning. Crawlere, også AI-bots, der ikke kører JavaScript, modtager fuldt indhold fra Next.js uden ekstra opsætning.
Ikke i sig selv. I App Router tilføjer du en sitemap.ts-fil i app-mappen, der returnerer dine URL'er, og Next.js serverer den på /sitemap.xml. Til store sites deler generateSitemaps listen op i flere filer, da Google accepterer op til 50.000 URL'er pr. sitemap.
Begge kan rangere godt, fordi begge prerenderer HTML. App Router er det anbefalede valg til nye projekter: Server Components reducerer JavaScript i klienten, og Metadata API'et, sitemap.ts og robots.ts håndterer SEO-filerne naturligt. På et eksisterende site med Pages Router er en migrering sjældent umagen værd for SEO alene.
DE PRØVEDE SORANK, FØR DU GJORDE DET
