Посібник з SEO для Next.js: вибір SSG, SSR чи ISR, метадані й canonical, генерація sitemap.xml, блог на webhook і сторінки, зрозумілі краулерам ШІ.

Коротко
Next.js належить до найкращих фреймворків React для SEO, бо віддає пошуковим роботам повний HTML, а не порожню оболонку. Щоб ранжуватися, пререндерте сторінки з контентом (статична генерація або ISR), задавайте заголовки, описи й canonical через Metadata API, генеруйте sitemap.xml і robots.txt з папки app, використовуйте справжні посилання й коректні коди відповіді та тримайте основний контент поза кодом, що працює лише в браузері: більшість краулерів ШІ не виконують JavaScript.
Хочете дізнатися більше? Запитайте
Швидкий тест
Чи підходить вам SEO і з чого почати?
4 короткі питання, щоб зрозуміти, чи може Google приводити вам клієнтів.
Наша порада для вас
Sorank підходить вам найкраще
Люди шукають те, що ви продаєте, і ви можете зачекати кілька місяців: Sorank знаходить потрібні запити, пише й публікує статті та отримує для вас посилання.
Sorank відповідає вашим відповідям
Спробуйте його 3 дні на власному сайті або почніть з безкоштовного аудиту, щоб побачити, де ви зараз.
3 дні безкоштовно, потім зупиніть, коли захочете. Гарантія повернення коштів протягом 90 днів.
SEO для Next.js зводиться до правильного вибору для кожного маршруту: що рендериться на сервері, що кешується і що потрапляє в HTML до запуску будь-якого скрипта. Google пояснює в основах SEO для JavaScript, що обробляє JavaScript-застосунки у три етапи (сканування, рендеринг, індексування) і що рендеринг на сервері або попередній рендеринг «досі чудова ідея». Next.js робить це за замовчуванням. Посібник присвячено App Router (Next.js 13 і новіші), з поясненнями для старого Pages Router.
Так. Звичайний React-застосунок із рендерингом на боці клієнта віддає майже порожній HTML-файл і збирає сторінку в браузері; пошуковикам треба її відрендерити, а багато ботів цього не роблять зовсім. Next.js рендерить React на сервері, тож HTML-відповідь уже містить заголовки, текст, посилання й метадані. Наш посібник з SEO для JavaScript пояснює, чому ця різниця важлива для індексування.
В App Router компоненти за замовчуванням є Server Components. Навіть компоненти з позначкою 'use client' пререндеряться в HTML на сервері. Слабке місце: дані. Усе, що ви завантажуєте в useEffect або лише після кліку, відсутнє в початковому HTML. Отримуйте контент у Server Components, а клієнтські компоненти залиште для інтерактивності.
Next.js дає змогу поєднувати режими для різних маршрутів. Вибір впливає на актуальність, швидкість і те, що отримують роботи.
| Режим | Коли створюється HTML | Оцінка для SEO | Підходить для |
|---|---|---|---|
| Статична генерація (SSG) | Під час збирання | Найкращий варіант: повний HTML, дуже швидко | Лендинги, документація, вічнозелені статті |
| Інкрементальна статична регенерація (ISR) | Під час збирання, потім оновлюється у фоні або на запит | Найкращий варіант для великих або мінливих сайтів | Блоги, каталоги товарів, сторінки з CMS |
| Рендеринг на сервері (SSR) | На кожен запит | Добре: повний HTML, залежить від швидкості сервера | Персоналізовані сторінки та сторінки в реальному часі |
| Рендеринг на клієнті (CSR) | У браузері | Слабко: контент невидимий для більшості ботів | Панелі керування за авторизацією |
Документація Next.js щодо ISR перелічує переваги: оновлювати статичний контент «без перезбирання всього сайту» й обслуговувати велику кількість сторінок без довгого збирання. Маршрут з export const revalidate = 3600 перегенеровується не частіше ніж раз на годину; для точного контролю викликайте revalidatePath або revalidateTag, коли змінюється контент. ISR не працює зі статичним експортом (output: 'export'). Для застосунків, що мають лишатися з клієнтським рендерингом, наш посібник з SEO для односторінкових застосунків описує обхідні шляхи.
Порада
Перевіряйте те, що отримують боти, а не те, що показує браузер: виконайте curl для URL або відкрийте view-source і знайдіть фразу зі статті. Якщо її немає у вихідному HTML, вона залежить від JavaScript.
Metadata API замінює next/head в App Router. Згідно з документацією Next.js щодо метаданих, ви експортуєте статичний об'єкт metadata з layout або сторінки чи функцію generateMetadata, якщо значення залежать від даних, і Next.js генерує теги head. Обидва варіанти підтримуються лише в 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] },
}
}П'ять правил, які запобігають більшості проблем:
На динамічних сторінках Next.js передає метадані потоком після перших байтів, щоб пришвидшити рендеринг. Документація уточнює, що потокова передача вимкнена для ботів, які чекають метадані в head і визначаються за user agent (серед прикладів Bingbot, Twitterbot і Slackbot), а опція htmlLimitedBots дає змогу змінити список. Якщо важливого для вас краулера там немає, додайте його. У Pages Router аналог: компонент Head з next/head з атрибутом key проти дублювання тегів.
Обидва файли спеціальні й лежать у папці app. Файл sitemap.ts, що експортує функцію зі списком URL, перетворюється на /sitemap.xml; файл robots.ts перетворюється на /robots.txt. Довідник щодо карти сайту зазначає, що файл за замовчуванням кешується, а ліміт Google становить 50 000 URL на одну карту сайту; понад нього generateSitemaps ділить її на кілька файлів.
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,
}))
}Додавайте лише канонічні, індексовані URL з відповіддю 200 і вказуйте в lastModified реальну дату оновлення. Для багатомовних сайтів карта сайту приймає також alternates.languages. У robots.ts вкажіть карту сайту й вирішіть, яким ботам ШІ дозволено сканування; наша стаття про robots.txt для краулерів ШІ їх перелічує. Докладніше про формат у статті глосарію про XML-карту сайту.
| Проблема | Що відбувається | Рішення |
|---|---|---|
| Навігація через onClick і router.push | Google переходить лише за елементами a з href | Використовувати компонент Link з next/link, який виводить справжнє посилання |
| Неіснуючий контент віддається як сторінка 200 | «Хибна помилка 404» у Search Console | Викликати notFound(), щоб маршрут повернув статус 404 |
| Тимчасові переспрямування для перенесених сторінок | redirect() надсилає 307 | Використовувати permanentRedirect() або permanent: true у next.config (308) |
| Змішані слеші в кінці URL | Два URL для однієї сторінки | Обрати один варіант опцією trailingSlash і тримати canonical узгодженими |
| Проіндексовані прев'ю й тестові середовища | Дублі сайту в Google | Віддавати noindex на неробочих доменах |
| Контент вкладок, що завантажується за кліком | Тексту немає в HTML | Рендерити весь контент на сервері й за потреби ховати через CSS |
Усі ці проблеми знижують сканованість: краулер має знаходити кожен URL за посиланнями й отримувати чистий код відповіді.
Документація Next.js радить рендерити JSON-LD у тегу script з типом application/ld+json безпосередньо в компоненті сторінки або layout, на основі тих самих даних, що й сторінка, та екранувати символ < у серіалізованому JSON, щоб унеможливити ін'єкції. Оскільки розмітка рендериться на сервері, Google і краулери ШІ бачать її у вихідному HTML. Використовуйте Article (або BlogPosting) для статей, Organization у кореневому layout, BreadcrumbList для глибоких сторінок і Product для інтернет-магазину. Генератор schema дасть коректний стартовий блок, а потім перевірте сторінку інструментом перевірки розширених результатів Google.
У Next.js є компоненти, що усувають типові причини поганих Core Web Vitals:
Вимірюйте польові дані, а не лише лабораторний бал: наш посібник з PageSpeed Insights показує, як читати і те, і інше.
Блог на Next.js зазвичай побудовано одним із трьох способів: файли MDX або Markdown у репозиторії (просто, але кожна стаття потребує коміту й деплою), headless CMS (Sanity, Contentful, Strapi, Payload), до якої звертаються з Server Components, або webhook публікації, що приймає статті із зовнішнього інструмента. В усіх трьох випадках SEO-схема однакова: динамічний маршрут app/blog/[slug] з generateStaticParams, generateMetadata та ISR, карта сайту з того самого джерела й сторінка-список із посиланнями на всі статті.
Webhook відокремлює публікацію від циклу деплою. Route Handler приймає статтю, зберігає її, а потім ревалідує потрібні сторінки:
// 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 })
}Увага
Захистіть ендпоінт секретом і ревалідуйте точний публічний шлях. Документація ISR попереджає: за кількох екземплярів сервера й файлового кешу за замовчуванням ревалідація на запит очищає лише той екземпляр, який отримав виклик; використовуйте спільний обробник кешу.
Рендеринг на сервері є першою умовою GEO (оптимізації для генеративних систем). Аналіз Vercel від грудня 2024 року, The rise of the AI crawler, показав, що «жоден із великих краулерів ШІ наразі не рендерить JavaScript», назвав GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot і PerplexityBot та нарахував за місяць у своїй мережі 569 мільйонів запитів GPTBot і 370 мільйонів запитів Claude. Сторінку на Next.js, яка пререндерить текст, заголовки й JSON-LD, читають усі вони; сторінку з клієнтським рендерингом ні.
Друга умова: контент, який варто цитувати. Це статті, де кожен розділ відповідає на одне питання, з джерелами, цифрами й чіткими визначеннями, опубліковані регулярно. Цю частину автоматизує Sorank, наш продукт. Sorank: програма для SEO і GEO в режимі autopilot. Вона знаходить ваші ключові слова, а Генератор статей для блогу пише 20, 60 або 120 статей на місяць із джерелами, внутрішніми посиланнями й зображеннями. До сайту на Next.js вона підключається через користувацький webhook, описаний на сторінці встановлення: ваш Route Handler приймає кожну статтю, зберігає її й ревалідує блог. Потім Відстеження згадок у ШІ щотижня перевіряє, чи цитують ваш бренд ChatGPT, Claude і Gemini.

Підсумок: пререндерте кожну сторінку, яку мають знаходити, задавайте метадані на сервері й наповнюйте карту сайту з того самого джерела, що й контент. Next.js дає інструменти, а позиції та цитування в ШІ залежать від того, що ви з їхньою допомогою публікуєте. Щоб регулярно наповнювати блог на Next.js статтями, перегляньте тарифи Sorank: від 49 доларів на місяць і 3 дні безкоштовного пробного періоду.
Next.js побудовано на React, тож порівнювати варто способи рендерингу. Стандартний односторінковий застосунок на React рендериться в браузері й віддає майже порожній HTML, а Next.js пререндерить сторінки на сервері або під час збирання. Краулери, зокрема боти ШІ, що не виконують JavaScript, отримують від Next.js повний контент без додаткових налаштувань.
Сам по собі ні. В App Router ви додаєте в папку app файл sitemap.ts, який повертає ваші URL, і Next.js віддає його за адресою /sitemap.xml. Для великих сайтів generateSitemaps ділить список на кілька файлів, бо Google приймає до 50 000 URL в одній карті сайту.
Обидва варіанти можуть добре ранжуватися, бо обидва пререндерять HTML. Для нових проєктів рекомендовано App Router: Server Components зменшують обсяг клієнтського JavaScript, а Metadata API, sitemap.ts і robots.ts нативно обробляють SEO-файли. На наявному сайті з Pages Router перехід лише заради SEO рідко виправданий.
ВОНИ ПРОБУВАЛИ SORANK ДО ВАС
