Guide till SEO för Next.js: välj SSG, SSR eller ISR, ange metadata och canonicals, generera sitemap.xml, kör en blogg som matas via webhook och håll den läsbar för AI-sökrobotar.

På den här sidan
Kort sagt
Next.js är ett av de bästa React-ramverken för SEO eftersom det skickar komplett HTML till sökrobotar i stället för ett tomt skal. För att rankas bör du förrendera innehållssidor (statisk generering eller ISR), definiera titlar, beskrivningar och canonicals med Metadata API, generera sitemap.xml och robots.txt från app-mappen, använda riktiga länkar och korrekta statuskoder, och hålla ditt huvudinnehåll utanför kod som bara körs i webbläsaren, eftersom de flesta AI-sökrobotar inte kör JavaScript.
Vill du veta mer? Fråga
Snabbquiz
Är SEO rätt för dig, och hur ska du börja?
Sorank matchar dina svar
Testa det i 3 dagar på din egen webbplats och se var du står på Google, ChatGPT och de andra AI-tjänsterna.
Starta 3 dagars gratis provperiod3 dagar gratis, sedan kan du avsluta när du vill. 90 dagars garanti med pengarna tillbaka om du inte ser resultat.
Next.js SEO handlar främst om att göra rätt val för varje rutt: vad som renderas på servern, vad som cachas och vad som når HTML:en innan något skript körs. Google förklarar i sina grunder för JavaScript-SEO att de bearbetar JavaScript-appar i tre faser (genomsökning, rendering, indexering) och att ”server-side- eller förrendering fortfarande är en mycket bra idé”. Next.js gör det som standard. Den här guiden tar upp App Router (Next.js 13 och senare), med noteringar för den äldre Pages Router.
Ja. En vanlig React-app med rendering i klienten skickar en nästan tom HTML-fil och bygger sidan i webbläsaren; sökmotorer måste rendera den, och många robotar gör aldrig det. Next.js renderar React på servern, så HTML-svaret innehåller redan rubrikerna, texten, länkarna och metadata. Vår guide till JavaScript-SEO förklarar varför skillnaden spelar roll för indexeringen.
I App Router är komponenterna Server Components som standard. Även komponenter markerade med 'use client' förrenderas till HTML på servern. Den svaga punkten är data: allt du hämtar i useEffect, eller bara laddar efter ett klick, saknas i den första HTML:en. Hämta innehåll i Server Components, och behåll klientkomponenter för interaktivitet.
Next.js låter dig blanda lägen rutt för rutt. Valet påverkar färskhet, hastighet och vad sökrobotar får.
| Läge | När HTML:en byggs | SEO-bedömning | Bra för |
|---|---|---|---|
| Statisk generering (SSG) | Vid bygget | Bäst: komplett HTML, mycket snabbt | Målsidor, dokumentation, tidlösa artiklar |
| Inkrementell statisk regenerering (ISR) | Vid bygget, sedan uppdaterad i bakgrunden eller vid behov | Bäst för stora eller föränderliga webbplatser | Bloggar, produktkataloger, CMS-sidor |
| Rendering på servern (SSR) | Vid varje förfrågan | Bra: komplett HTML, beror på serverns hastighet | Personliga eller realtidssidor |
| Rendering i klienten (CSR) | I webbläsaren | Svag: innehållet är osynligt för de flesta robotar | Instrumentpaneler bakom inloggning |
Dokumentationen för Next.js ISR listar fördelarna: att uppdatera statiskt innehåll ”utan att bygga om hela webbplatsen” och att hantera stora mängder sidor utan långa byggtider. En rutt med export const revalidate = 3600 regenereras högst en gång i timmen; för exakt kontroll anropar du revalidatePath eller revalidateTag när innehållet ändras. Observera att ISR inte fungerar med en statisk export (output: 'export'). För appar som måste förbli klientrenderade täcker vår guide till SEO för single page applications lösningarna.
Tips
Kontrollera vad robotarna får, inte vad din webbläsare visar: kör curl på URL:en eller öppna view-source och sök efter en mening ur artikeln. Om den inte finns i den råa HTML:en beror den på JavaScript.
Metadata API ersätter next/head i App Router. Enligt Next.js-dokumentationen för metadata exporterar du ett statiskt metadataobjekt från en layout eller sida, eller en funktion generateMetadata när värdena beror på data, och Next.js genererar head-taggarna. Båda stöds endast 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 förhindrar de flesta problemen:
På dynamiska sidor strömmar Next.js metadata efter de första byten för att snabba upp renderingen. Dokumentationen säger att strömningen stängs av för robotar som förväntar sig metadata i head, identifierade via user agent (Bingbot, Twitterbot och Slackbot är några exempel), och att alternativet htmlLimitedBots anpassar listan. Om du bryr dig om en robot som inte omfattas, lägg till den. I Pages Router är motsvarigheten komponenten Head från next/head, med ett key-attribut för att undvika dubbletter av taggar.
Båda är specialfiler i app-mappen. En fil sitemap.ts som exporterar en funktion som returnerar URL:er blir /sitemap.xml; en fil robots.ts blir /robots.txt. Referensen för sitemap noterar att filen cachas som standard och att Googles gräns är 50,000 URL:er per sitemap; över den gränsen delar generateSitemaps upp den i flera 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 med endast kanoniska, indexerbara URL:er som returnerar 200, och använd det verkliga uppdateringsdatumet i lastModified. Sitemapen accepterar också alternates.languages för flerspråkiga webbplatser. I robots.ts pekar du på sitemapen och bestämmer vilka AI-robotar som får genomsöka webbplatsen; vår artikel om robots.txt för AI-sökrobotar listar dem. Mer om formatet finns i vårt ordboksavsnitt om XML-webbplatskartan.
| Problem | Vad som händer | Lösning |
|---|---|---|
| Navigering med onClick och router.push | Google följer bara a-element med en href | Använd komponenten Link från next/link, som renderar en riktig länk |
| Saknat innehåll renderas som en 200-sida | Mjuk 404 i Search Console | Anropa notFound() så att rutten returnerar statuskoden 404 |
| Tillfälliga omdirigeringar för flyttade sidor | redirect() skickar en 307 | Använd permanentRedirect() eller permanent: true i next.config (308) |
| Blandade avslutande snedstreck | Två URL:er för samma sida | Välj en med alternativet trailingSlash och håll canonicals konsekventa |
| Förhandsvisnings- eller testmiljöer indexeras | Dubbletter av webbplatsen i Google | Skicka noindex på domäner som inte är produktion |
| Innehåll bakom flikar som laddas vid klick | Texten saknas i HTML:en | Rendera allt innehåll på servern och dölj det med CSS vid behov |
Dessa problem minskar alla genomsökbarheten: en robot måste kunna hitta varje URL via länkar och få en ren statuskod.
Next.js-dokumentationen rekommenderar att JSON-LD renderas som en script-tagg av typen application/ld+json direkt i sid- eller layoutkomponenten, byggd från samma data som sidan, och att tecknet < escapas i den serialiserade JSON:en för att förhindra injicering. Eftersom den renderas på servern ser både Google och AI-robotar den i den råa HTML:en. Använd Article (eller BlogPosting) för inlägg, Organization i root-layouten, BreadcrumbList för djupa sidor och Product för e-handel. En schemagenerator ger dig ett giltigt startblock, och validera sedan sidan med Googles Rich Results Test.
Next.js levererar komponenter som hanterar de vanliga orsakerna till dåliga Core Web Vitals:
Mät fältdata, inte bara ett labbresultat: vår guide till PageSpeed Insights visar hur du läser båda.
En Next.js-blogg brukar ha en av tre former: MDX- eller Markdown-filer i repositoryt (enkelt, men varje inlägg kräver en commit och en driftsättning), ett headless CMS (Sanity, Contentful, Strapi, Payload) som hämtas i Server Components, eller en publiceringswebhook som tar emot artiklar från ett externt verktyg. I alla tre fallen är SEO-mönstret detsamma: en dynamisk rutt app/blog/[slug] med generateStaticParams, generateMetadata och ISR, sitemapen matad från samma källa, och en indexsida som länkar till varje inlägg.
Webhook-mönstret håller publiceringen utanför din driftsättningscykel. En Route Handler tar emot artikeln, sparar den och uppdaterar sedan de berörda sidorna:
// 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 })
}Se upp
Skydda slutpunkten med en hemlighet, och uppdatera den exakta publika sökvägen. ISR-dokumentationen varnar för att med flera serverinstanser och standardcachen i filer rensar uppdatering på begäran bara den instans som tar emot anropet; använd därför en delad cache-hanterare.
Rendering på servern är det första villkoret för GEO (generative engine optimization). Vercels analys från december 2024, The rise of the AI crawler, fann att ”ingen av de stora AI-robotarna för närvarande renderar JavaScript”. Den nämner GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot och PerplexityBot, och räknade 569 miljoner GPTBot-hämtningar och 370 miljoner Claude-hämtningar i sitt nätverk under en månad. En Next.js-sida som förrenderar sin text, rubriker och JSON-LD kan läsas av alla dem; en klientrenderad sida kan inte det.
Det andra villkoret är innehåll värt att citera: artiklar som besvarar en fråga per avsnitt, med källor, siffror och tydliga definitioner, publicerade regelbundet. Det är den del som Sorank, vår produkt, automatiserar. Sorank är en programvara för SEO och GEO på autopilot: den hittar dina sökord, och dess generator för bloggartiklar skriver 20, 60 eller 120 artiklar per månad med källor, interna länkar och bilder. På en Next.js-webbplats kopplar den in via den anpassade webhooken som beskrivs på installationssidan: din Route Handler tar emot varje artikel, sparar den och uppdaterar bloggen. Spårning av AI-omnämnanden kontrollerar sedan varje månad om ChatGPT, Claude och Gemini citerar ditt varumärke.

Kort version: förrendera varje sida du vill ska hittas, ange metadata på servern och mata sitemapen från samma källa som innehållet. Next.js ger dig verktygen; rankningar och AI-citeringar kommer från det du publicerar med dem. För att hålla en Next.js-blogg försedd med artiklar, se Sorank:s abonnemang, från $49 per månad med 3 dagars gratis provperiod.
Next.js bygger på React, så jämförelsen gäller renderingssätt. En standard-React-app med single page-arkitektur renderas i webbläsaren och skickar nästan tom HTML, medan Next.js förrenderar sidor på servern eller vid bygget. Robotar, inklusive AI-robotar som inte kör JavaScript, får komplett innehåll från Next.js utan extra konfiguration.
Inte av sig själv. I App Router lägger du till en fil sitemap.ts i app-mappen som returnerar dina URL:er, och Next.js serverar den på /sitemap.xml. För stora webbplatser delar generateSitemaps upp listan i flera filer, eftersom Google accepterar upp till 50,000 URL:er per sitemap.
Båda kan rankas bra eftersom båda förrenderar HTML. App Router är det rekommenderade valet för nya projekt: Server Components minskar JavaScript i klienten, och Metadata API, sitemap.ts och robots.ts hanterar SEO-filerna inbyggt. På en befintlig webbplats med Pages Router är en migrering sällan värd det enbart för SEO.
DE TESTADE SORANK FÖRE DIG
