Ghid SEO pentru Next.js: alege SSG, SSR sau ISR, setează metadatele și etichetele canonical, generează sitemap.xml, rulează un blog alimentat prin webhook și rămâi lizibil pentru crawlerele AI.

Pe această pagină
Pe scurt
Next.js este unul dintre cele mai bune framework-uri React pentru SEO, pentru că trimite crawlerelor HTML complet, nu o carcasă goală. Ca să te clasezi, pre-randează paginile de conținut (generare statică sau ISR), definește titlurile, descrierile și etichetele canonical cu Metadata API, generează sitemap.xml și robots.txt din dosarul app, folosește linkuri reale și coduri de stare corecte și ține conținutul principal în afara codului care rulează doar în client, pentru că majoritatea crawlerelor AI nu rulează JavaScript.
Vrei să afli mai mult? Întreabă
Test rapid
Ți se potrivește SEO și cum ar trebui să începi?
Sorank se potrivește răspunsurilor tale
Testează-l 3 zile pe propriul site și vezi unde te afli pe Google, ChatGPT și pe celelalte IA.
Începe perioada de test gratuită de 3 zile3 zile gratuit, apoi renunți oricând vrei. Garanție de rambursare în 90 de zile dacă nu vezi rezultate.
SEO Next.js ține în primul rând de alegerea corectă pentru fiecare rută: ce se randează pe server, ce se păstrează în cache și ce ajunge în HTML înainte ca vreun script să ruleze. Google explică în elementele de bază ale SEO pentru JavaScript că procesează aplicațiile JavaScript în trei faze (parcurgere, randare, indexare) și că „randarea pe server sau pre-randarea rămâne o idee foarte bună”. Next.js face asta implicit. Ghidul acoperă App Router (Next.js 13 și versiunile ulterioare), cu note pentru vechiul Pages Router.
Da. O aplicație React simplă, construită cu randare pe client, trimite un fișier HTML aproape gol și construiește pagina în browser; motoarele de căutare trebuie să o randeze, iar multe boturi nu o fac niciodată. Next.js randează React pe server, deci răspunsul HTML conține deja titlurile, textul, linkurile și metadatele. Ghidul nostru despre SEO pentru JavaScript explică de ce contează diferența pentru indexare.
În App Router, componentele sunt Server Components implicit. Chiar și componentele marcate 'use client' sunt pre-randate în HTML pe server. Punctul slab sunt datele: orice este adus în useEffect sau încărcat doar după un clic lipsește din HTML-ul inițial. Adu conținutul în Server Components și păstrează componentele client pentru interactivitate.
Next.js îți permite să combini modurile ruta cu ruta. Alegerea influențează prospețimea, viteza și ce primesc crawlerele.
| Mod | Când se construiește HTML-ul | Verdict SEO | Potrivit pentru |
|---|---|---|---|
| Generare statică (SSG) | La build | Cel mai bun: HTML complet, foarte rapid | Pagini de prezentare, documentație, articole atemporale |
| Regenerare statică incrementală (ISR) | La build, apoi reîmprospătat în fundal sau la cerere | Cel mai bun pentru site-uri mari sau cu schimbări frecvente | Bloguri, cataloage de produse, pagini CMS |
| Randare pe server (SSR) | La fiecare cerere | Bun: HTML complet, depinde de viteza serverului | Pagini personalizate sau în timp real |
| Randare pe client (CSR) | În browser | Slab: conținut invizibil pentru majoritatea boturilor | Tablouri de bord în spatele unei autentificări |
Documentația Next.js despre ISR enumeră beneficiile: actualizarea conținutului static „fără să reconstruiești întregul site” și gestionarea unui număr mare de pagini fără build-uri lungi. O rută cu export const revalidate = 3600 este regenerată cel mult o dată pe oră; pentru un control exact, apelează revalidatePath sau revalidateTag când se schimbă conținutul. Atenție: ISR nu funcționează cu un export static (output: 'export'). Pentru aplicațiile care trebuie să rămână randate pe client, ghidul nostru despre SEO pentru aplicațiile cu o singură pagină acoperă soluțiile de ocolire.
Sfat
Verifică ce primesc boții, nu ce vezi în browser: rulează curl pe adresă sau deschide view-source și caută o propoziție din articol. Dacă nu se află în HTML-ul brut, depinde de JavaScript.
Metadata API înlocuiește next/head în App Router. Conform documentației Next.js despre metadate, exporți un obiect static de metadate dintr-un layout sau o pagină, sau o funcție generateMetadata când valorile depind de date, iar Next.js generează etichetele head. Ambele sunt acceptate doar în 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] },
}
}Cinci reguli care previn majoritatea problemelor:
Pe paginile dinamice, Next.js transmite metadatele în flux după primii octeți, ca să accelereze randarea. Documentația precizează că streaming-ul este dezactivat pentru boții care așteaptă metadatele în head, detectați după user agent (Bingbot, Twitterbot și Slackbot sunt printre exemple), iar opțiunea htmlLimitedBots personalizează lista. Dacă ție îți pasă de un crawler care nu este acoperit, adaugă-l. În Pages Router, echivalentul este componenta Head din next/head, cu un atribut key ca să eviți etichetele duplicate.
Ambele sunt fișiere speciale din dosarul app. Un fișier sitemap.ts care exportă o funcție ce returnează adrese devine /sitemap.xml; un fișier robots.ts devine /robots.txt. Referința pentru sitemap notează că fișierul este pus în cache implicit și că limita Google este de 50.000 de adrese pe sitemap; peste această limită, generateSitemaps îl împarte în mai multe fișiere.
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,
}))
}Include doar adrese canonical, indexabile, care returnează 200, și folosește data reală a actualizării în lastModified. Sitemap-ul acceptă și alternates.languages pentru site-urile multilingve. În robots.ts, indică sitemap-ul și decide ce boturi AI au voie să parcurgă site-ul; articolul nostru despre robots.txt pentru crawlerele AI le enumeră. Mai multe despre format găsești în intrarea noastră din glosar despre harta XML a site-ului.
| Problemă | Ce se întâmplă | Soluție |
|---|---|---|
| Navigare cu onClick și router.push | Google urmărește doar elementele a care au un href | Folosește componenta Link din next/link, care randează un link real |
| Conținut lipsă afișat ca pagină 200 | Soft 404 în Search Console | Apelează notFound() ca ruta să returneze un cod 404 |
| Redirecționări temporare pentru pagini mutate | redirect() trimite un 307 | Folosește permanentRedirect() sau permanent: true în next.config (308) |
| Slash-uri finale amestecate | Două adrese pentru aceeași pagină | Alege una cu opțiunea trailingSlash și păstrează etichetele canonical consecvente |
| Versiuni de previzualizare sau de test indexate | Copii duplicate ale site-ului în Google | Trimite noindex pe domeniile care nu sunt de producție |
| Conținut din taburi încărcat la clic | Text absent din HTML | Randează tot conținutul pe server și ascunde-l cu CSS dacă e nevoie |
Toate aceste probleme reduc parcurgibilitatea: un crawler trebuie să poată descoperi fiecare adresă prin linkuri și să primească un cod de stare curat.
Documentația Next.js recomandă randarea JSON-LD ca etichetă script de tip application/ld+json direct în componenta paginii sau a layout-ului, construită din aceleași date ca pagina, iar caracterul < din JSON-ul serializat să fie scăpat pentru a preveni injectarea. Fiind randat pe server, este văzut în HTML-ul brut atât de Google, cât și de crawlerele AI. Folosește Article (sau BlogPosting) pentru articole, Organization în layout-ul rădăcină, BreadcrumbList pentru paginile adânci și Product pentru comerț electronic. Un generator de schema îți dă un punct de plecare valid, apoi validează pagina cu Rich Results Test de la Google.
Next.js include componentele care tratează cauzele obișnuite ale unor Core Web Vitals slabe:
Măsoară datele de teren, nu doar scorul de laborator: ghidul nostru despre PageSpeed Insights arată cum citești ambele.
Un blog Next.js ia de obicei una din trei forme: fișiere MDX sau Markdown în depozit (simplu, dar fiecare articol cere un commit și un deploy), un CMS headless (Sanity, Contentful, Strapi, Payload) adus în Server Components sau un webhook de publicare care primește articole dintr-un instrument extern. În toate cele trei cazuri, modelul SEO este același: o rută dinamică app/blog/[slug] cu generateStaticParams, generateMetadata, ISR, sitemap-ul alimentat din aceeași sursă și o pagină index care leagă fiecare articol.
Modelul cu webhook scoate publicarea din ciclul de deploy. Un Route Handler primește articolul, îl salvează, apoi reîmprospătează paginile afectate:
// 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 })
}Atenție
Protejează endpoint-ul cu un secret și reîmprospătează exact adresa publică. Documentația ISR avertizează că, cu mai multe instanțe de server și cache-ul implicit pe fișiere, reîmprospătarea la cerere curăță doar instanța care primește apelul; folosește un handler de cache partajat.
Randarea pe server este prima condiție pentru GEO (optimizarea pentru motoarele generative). Analiza Vercel din decembrie 2024, Ascensiunea crawlerului AI, a constatat că „niciunul dintre principalii crawleri AI nu randează în prezent JavaScript”, numind GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot și PerplexityBot, și a numărat 569 de milioane de accesări GPTBot și 370 de milioane de accesări Claude pe rețeaua sa, într-o singură lună. O pagină Next.js care pre-randează textul, titlurile și JSON-LD este citibilă de toți; o pagină randată pe client nu este.
A doua condiție este conținutul care merită citat: articole care răspund la o întrebare pe secțiune, cu surse, cifre și definiții clare, publicate regulat. Asta este partea pe care Sorank, produsul nostru, o automatizează. Sorank este un software SEO și GEO în regim autopilot: găsește cuvintele tale cheie, iar generatorul de articole pentru blog scrie 20, 60 sau 120 de articole pe lună, cu surse, linkuri interne și imagini. Pe un site Next.js, se conectează prin webhook-ul personalizat descris pe pagina de instalare: Route Handler-ul tău primește fiecare articol, îl salvează și reîmprospătează blogul. Urmărirea mențiunilor AI verifică apoi în fiecare lună dacă ChatGPT, Claude și Gemini îți citează brandul.

Pe scurt: pre-randează fiecare pagină pe care vrei să fie găsită, definește metadatele pe server și alimentează sitemap-ul din aceeași sursă ca și conținutul. Next.js îți oferă uneltele; clasările și citările AI vin din ce publici cu ele. Ca să alimentezi un blog Next.js cu articole, vezi planurile Sorank, de la 49 de dolari pe lună, cu o perioadă de probă gratuită de 3 zile.
Next.js este construit pe React, deci comparația este între abordările de randare. O aplicație React implicită cu o singură pagină se randează în browser și trimite un HTML aproape gol, în timp ce Next.js pre-randează paginile pe server sau la build. Crawlerele, inclusiv boții AI care nu rulează JavaScript, primesc de la Next.js conținut complet, fără configurare suplimentară.
Nu de la sine. În App Router adaugi un fișier sitemap.ts în dosarul app, care returnează adresele tale, iar Next.js îl servește la /sitemap.xml. Pentru site-urile mari, generateSitemaps împarte lista în mai multe fișiere, deoarece Google acceptă până la 50.000 de adrese pe sitemap.
Amândouă se pot clasa bine, pentru că amândouă pre-randează HTML-ul. App Router este alegerea recomandată pentru proiectele noi: Server Components reduc JavaScript-ul din client, iar Metadata API, sitemap.ts și robots.ts gestionează nativ fișierele SEO. Pe un site existent cu Pages Router, migrarea merită rar doar pentru SEO.
AU ÎNCERCAT SORANK ÎNAINTEA TA
