Next.js SEO útmutató: válassz SSG, SSR vagy ISR módot, állítsd be a metaadatokat és a canonical címkéket, generálj sitemap.xml fájlt, futtass webhookkal táplált blogot, és maradj olvasható az AI-robotok számára.

Ezen az oldalon
Röviden
a Next.js az egyik legjobb React-keretrendszer SEO-szempontból, mert teljes HTML-t küld a robotoknak üres váz helyett. A rangsoroláshoz rendereld előre a tartalmi oldalakat (statikus generálás vagy ISR), határozd meg a címeket, leírásokat és canonical címkéket a Metadata API-val, generálj sitemap.xml és robots.txt fájlt az app mappából, használj valódi linkeket és helyes státuszkódokat, és tartsd a fő tartalmadat kizárólag kliensoldali kódon kívül, mert a legtöbb AI-robot nem futtat JavaScriptet.
Szeretnél többet megtudni? Kérdezd meg
Gyors kvíz
Neked való a SEO, és hogyan kezdd el?
A Sorank illeszkedik a válaszaidra
Próbáld ki 3 napig a saját weboldaladon, és nézd meg, hol állsz a Google-ben, a ChatGPT-ben és a többi MI-ben.
Indítsd el a 3 napos ingyenes próbát3 nap ingyen, utána bármikor leállhatsz. 90 napos eredménygarancia visszatérítéssel.
A Next.js SEO főleg arról szól, hogy útvonalanként jól döntsd el: mi renderelődik a szerveren, mi kerül gyorsítótárba, és mi kerül be a HTML-be, mielőtt bármilyen szkript lefutna. A Google a JavaScript SEO alapjaiban leírja, hogy a JavaScript-alkalmazásokat három fázisban dolgozza fel (bejárás, renderelés, indexelés), és hogy „a szerveroldali vagy előre renderelt megjelenítés továbbra is nagyon jó ötlet”. A Next.js ezt alapértelmezetten megteszi. Ez az útmutató az App Routerrel foglalkozik (Next.js 13-tól), a régebbi Pages Routerhez tartozó megjegyzésekkel.
Igen. Egy sima, kliensoldali renderelésű React-alkalmazás szinte üres HTML-fájlt küld, és az oldalt a böngészőben építi fel; a keresőmotoroknak ezt renderelniük kell, és sok robot soha nem teszi meg. A Next.js a szerveren renderel Reactot, így a HTML-válasz már tartalmazza a fejléceket, a szöveget, a linkeket és a metaadatokat. A JavaScript SEO útmutatónk elmagyarázza, miért fontos ez a különbség az indexeléshez.
Az App Routerben a komponensek alapértelmezetten Server Components. Még a 'use client' jelöléssel ellátott komponensek is előre renderelődnek HTML-re a szerveren. A gyenge pont az adat: minden, amit a useEffect-ben kérsz le, vagy csak egy kattintás után töltesz be, hiányzik a kezdeti HTML-ből. A tartalmat Server Components-ben kérd le, a kliens komponenseket pedig az interaktivitásra tartsd meg.
A Next.js útvonalanként keverheti a módokat. A választás hat a frissességre, a sebességre és arra, amit a robotok kapnak.
| Mód | Mikor épül a HTML | SEO-ítélet | Ideális |
|---|---|---|---|
| Statikus generálás (SSG) | Build időben | A legjobb: teljes HTML, nagyon gyors | Céloldalak, dokumentációk, örökzöld cikkek |
| Inkrementális statikus újragenerálás (ISR) | Build időben, majd a háttérben vagy igény szerint frissül | A legjobb nagy vagy változó oldalaknál | Blogok, termékkatalógusok, CMS-oldalak |
| Szerveroldali renderelés (SSR) | Minden kérésnél | Jó: teljes HTML, a szerver sebességétől függ | Személyre szabott vagy valós idejű oldalak |
| Kliensoldali renderelés (CSR) | A böngészőben | Gyenge: a tartalom a legtöbb robot számára láthatatlan | Bejelentkezés mögötti irányítópultok |
A Next.js ISR-dokumentációja felsorolja az előnyöket: a statikus tartalom frissíthető „az egész oldal újraépítése nélkül”, és nagy mennyiségű oldal kezelhető hosszú build-idő nélkül. Az export const revalidate = 3600 beállítású útvonal legfeljebb óránként regenerálódik; pontos vezérléshez a tartalom változásakor hívd meg a revalidatePath vagy a revalidateTag függvényt. Figyelj arra, hogy az ISR nem működik statikus exporttal (output: 'export'). Azoknak az alkalmazásoknak, amelyeknek kliensoldalon kell maradniuk, az egyoldalas alkalmazások SEO-ja útmutatónk tartalmazza a megkerülő megoldásokat.
Tipp
Azt ellenőrizd, amit a robotok kapnak, nem azt, amit a böngésződ mutat: futtass curl parancsot az URL-en, vagy nyisd meg a view-source nézetet, és keress rá egy mondatra a cikkből. Ha nincs a nyers HTML-ben, az JavaScripttől függ.
A Metadata API az App Routerben a next/head helyét veszi át. A Next.js metaadat-dokumentációja szerint egy layoutból vagy oldalból statikus metadata objektumot exportálsz, vagy generateMetadata függvényt, ha az értékek adattól függnek, és a Next.js generálja a fejléc címkéit. Mindkettő csak Server Components-ben támogatott.
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] },
}
}Öt szabály, amely a legtöbb problémát megelőzi:
Dinamikus oldalaknál a Next.js az első bájtok után streamelve küldi a metaadatokat, hogy gyorsítsa a renderelést. A dokumentáció szerint a streamelés azoknál a robotoknál le van tiltva, amelyek a fejlécben várják a metaadatokat, ezt a user agent alapján ismeri fel (például a Bingbot, a Twitterbot és a Slackbot), és a htmlLimitedBots beállítással testreszabható a lista. Ha egy nem szereplő robot számít neked, add hozzá. A Pages Routerben a megfelelő megoldás a next/head Head komponense, a key attribútummal, hogy elkerüld a duplikált címkéket.
Mindkettő speciális fájl az app mappában. Egy sitemap.ts fájl, amely URL-eket visszaadó függvényt exportál, a /sitemap.xml címet kapja; egy robots.ts fájl a /robots.txt címet. A sitemap-referencia megjegyzi, hogy a fájl alapértelmezetten gyorsítótárazott, és hogy a Google határa sitemapenként 50 000 URL; efölött a generateSitemaps több fájlra bontja.
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,
}))
}Csak a kanonikus, indexelhető, 200-as választ adó URL-eket vegyél bele, a lastModified mezőben pedig a valódi frissítési dátumot használd. A sitemap többnyelvű oldalaknál az alternates.languages beállítást is elfogadja. A robots.ts fájlban mutass a sitemapre, és döntsd el, mely AI-robotok járhatják be az oldalt; az AI-robotok robots.txt-jéről szóló cikkünk felsorolja őket. A formátumról bővebben az XML-sitemap szószedeti szócikkünkben olvashatsz.
| Probléma | Mi történik | Megoldás |
|---|---|---|
| Navigáció onClick és router.push segítségével | A Google csak href attribútummal rendelkező a elemeket követi | Használd a next/link Link komponensét, amely valódi linket jelenít meg |
| Hiányzó tartalom 200-as oldalként jelenik meg | Soft 404 a Search Console-ban | Hívd meg a notFound() függvényt, hogy az útvonal 404 státuszt adjon |
| Átköltöztetett oldalak ideiglenes átirányítása | A redirect() 307-es kódot küld | Használd a permanentRedirect() függvényt, vagy a permanent: true beállítást a next.config fájlban (308) |
| Vegyes záró perjelek | Két URL ugyanarra az oldalra | Válassz egyet a trailingSlash beállítással, és tartsd következetesen a canonical címkéket |
| Előnézeti vagy tesztkörnyezeti telepítések indexelve | Az oldal duplikált példányai a Google-ben | Küldj noindex jelzést a nem éles domaineken |
| Füleken keresztül, kattintásra betöltött tartalom | A szöveg hiányzik a HTML-ből | Jelenítsd meg az összes tartalmat a szerveren, és szükség esetén CSS-sel rejtsd el |
Ezek a problémák mind csökkentik a bejárhatóságot: a robotnak minden URL-t el kell tudnia érnie linkeken keresztül, és tiszta státuszkódot kell kapnia.
A Next.js dokumentációja azt javasolja, hogy a JSON-LD-t application/ld+json típusú script-címkeként rendereld közvetlenül az oldal vagy a layout komponensében, az oldallal azonos adatokból építve, és a sorosított JSON-ban escape-eld a < karaktert, hogy megelőzd a befecskendezést. Mivel a szerveren renderelődik, a Google és az AI-robotok is látják a nyers HTML-ben. Cikkekhez használj Article (vagy BlogPosting) típust, a gyökérlayoutban Organization-t, mély oldalaknál BreadcrumbList-et, webáruházaknál pedig Product-ot. A sémagenerátor érvényes kiindulópontot ad, utána a Google Rich Results Test eszközével ellenőrizd az oldalt.
A Next.js olyan komponenseket szállít, amelyek kezelik a gyenge Core Web Vitals szokásos okait:
Valós felhasználói adatot mérj, ne csak laboratóriumi pontszámot: a PageSpeed Insights útmutatónk megmutatja, hogyan olvasd mindkettőt.
Egy Next.js blog általában három formában létezik: MDX vagy Markdown fájlok a repositoryban (egyszerű, de minden poszthoz commit és telepítés kell), egy headless CMS (Sanity, Contentful, Strapi, Payload), amelyet Server Components-ben kérdezel le, vagy egy publikáló webhook, amely egy külső eszköztől fogadja a cikkeket. Mindhárom esetben az SEO-minta ugyanaz: egy dinamikus app/blog/[slug] útvonal generateStaticParams, generateMetadata és ISR beállítással, a sitemap ugyanabból a forrásból táplálva, és egy indexoldal, amely minden posztra linkel.
A webhook-minta kiveszi a publikálást a telepítési ciklusból. Egy Route Handler fogadja a cikket, elmenti, majd újravalidálja az érintett oldalakat:
// 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 })
}Figyelem
Védd a végpontot titokkal, és a pontos nyilvános útvonalat validáld újra. Az ISR-dokumentáció figyelmeztet: több szerverpéldány és az alapértelmezett fájl-gyorsítótár esetén az igény szerinti újravalidálás csak azt a példányt üríti, amelyik a hívást kapja; ilyenkor közös gyorsítótár-kezelőt használj.
A szerveroldali renderelés a GEO (generatív motoroptimalizálás) első feltétele. A Vercel 2024. decemberi elemzése, a Az AI-robotok felemelkedése megállapította, hogy „a nagy AI-robotok közül egyik sem renderel jelenleg JavaScriptet”, név szerint a GPTBotot, a ChatGPT-Usert, az OAI-SearchBotot, a ClaudeBotot és a PerplexityBotot említette, és egy hónap alatt 569 millió GPTBot-lekérést és 370 millió Claude-lekérést számolt a hálózatán. Egy Next.js oldal, amely előre rendereli a szövegét, a fejléceit és a JSON-LD-jét, mindegyikük számára olvasható; egy kliensoldalon renderelt oldal nem.
A második feltétel az idézésre érdemes tartalom: olyan cikkek, amelyek szakaszonként egy kérdésre válaszolnak, forrásokkal, adatokkal és világos definíciókkal, rendszeresen publikálva. Ezt a részt automatizálja a Sorank, a termékünk. A Sorank autopilot SEO- és GEO-szoftver: megtalálja a kulcsszavaidat, a blogcikk-generátora pedig havi 20, 60 vagy 120 cikket ír forrásokkal, belső linkekkel és képekkel. Egy Next.js oldalhoz az telepítési oldalon leírt egyéni webhookon keresztül csatlakozik: a Route Handler fogadja minden cikket, elmenti, és újravalidálja a blogot. Az AI-említések követése ezután havonta ellenőrzi, hogy a ChatGPT, a Claude és a Gemini idézi-e a márkádat.

A lényeg röviden: renderelj előre minden olyan oldalt, amelyet meg akarsz találni, határozd meg a metaadatokat a szerveren, és a sitemapet ugyanabból a forrásból táplálod, mint a tartalmat. A Next.js megadja az eszközöket; a rangsorolás és az AI-idézések abból jönnek, amit ezekkel publikálsz. Hogy a Next.js-es blogod folyamatosan kapjon cikkeket, nézd meg a Sorank csomagjait, havi $49-tól, 3 napos ingyenes próbaidőszakkal.
A Next.js a Reactra épül, így a kérdés a renderelési módok összehasonlítása. Egy alapértelmezett React egyoldalas alkalmazás a böngészőben renderel, és szinte üres HTML-t küld, míg a Next.js az oldalakat a szerveren vagy a build során előre rendereli. A robotok, köztük a JavaScriptet nem futtató AI-robotok, extra beállítás nélkül teljes tartalmat kapnak a Next.js-től.
Önmagában nem. Az App Routerben egy sitemap.ts fájlt helyezel az app mappába, amely visszaadja az URL-jeidet, és a Next.js ezt a /sitemap.xml címen szolgálja ki. Nagy oldalaknál a generateSitemaps több fájlra bontja a listát, mivel a Google sitemapenként legfeljebb 50 000 URL-t fogad el.
Mindkettő jól tud rangsorolni, mert mindkettő előre rendereli a HTML-t. Az App Router ajánlott az új projektekhez: a Server Components csökkenti a kliensoldali JavaScriptet, a Metadata API, a sitemap.ts és a robots.ts pedig natívan kezeli az SEO-fájlokat. Egy meglévő Pages Router oldal átállása csak SEO miatt ritkán éri meg.
A TE ELŐTTED PRÓBÁLTÁK KI A SORANKOT
