Назад в блог

Настройка SEO для сайта на Next

R
relaxdev
10.07.2026 24 просмотров

SEO для Next.js на RelaxDev — полный гайд

Всё что нужно сделать чтобы сайт попал в поисковики. Специфика Next.js App Router — robots и sitemap через TypeScript файлы в папке app/, файлы верификации — в public/.


1. robots.txt

Создайте src/app/robots.ts — Next.js автоматически отдаст его по адресу /robots.txt:

TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// src/app/robots.ts

import type { MetadataRoute } from 'next';



export default function robots(): MetadataRoute.Robots {

  return {

    rules: [

      {

        userAgent: '*',

        allow: '/',

        disallow: [

          '/api/',

          '/dashboard/',

          '/profile/',

          '/admin/',

          '/login/',

          '/auth/',

        ],

      },

    ],

    sitemap: 'https://ваш-домен.ru/sitemap.xml',

  };

}

**Проверка:** откройте https://ваш-домен.ru/robots.txt — должен открыться как текст со списком правил.


2. sitemap.xml

Создайте src/app/sitemap.ts:

TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// src/app/sitemap.ts

export const dynamic = 'force-dynamic';

import { MetadataRoute } from 'next';



export default function sitemap(): MetadataRoute.Sitemap {

  return [

    {

      url: 'https://ваш-домен.ru',

      lastModified: new Date(),

      changeFrequency: 'weekly',

      priority: 1,

    },

    {

      url: 'https://ваш-домен.ru/about',

      lastModified: new Date(),

      changeFrequency: 'monthly',

      priority: 0.8,

    },

  ];

}

С динамическим контентом из БД (Prisma):

TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
export const dynamic = 'force-dynamic';

import { MetadataRoute } from 'next';

import { prisma } from '@/lib/prisma';



export default async function sitemap(): Promise<MetadataRoute.Sitemap> {

  const baseUrl = 'https://ваш-домен.ru';



  const posts = await prisma.post.findMany({

    where: { published: true },

    select: { slug: true, updatedAt: true },

  });



  const staticPages: MetadataRoute.Sitemap = [

    { url: baseUrl, lastModified: new Date(), changeFrequency: 'weekly', priority: 1 },

    { url: `${baseUrl}/about`, changeFrequency: 'monthly', priority: 0.8 },

  ];



  const dynamicPages: MetadataRoute.Sitemap = posts.map(p => ({

    url: `${baseUrl}/blog/${p.slug}`,

    lastModified: p.updatedAt,

    changeFrequency: 'weekly' as const,

    priority: 0.7,

  }));



  return [...staticPages, ...dynamicPages];

}

**Проверка:** откройте https://ваш-домен.ru/sitemap.xml — должен открыться XML со списком страниц.


3. Закрыть закрытые страницы от индексации

Страницы с авторизацией и личными данными нельзя пускать в поисковики. В Next.js App Router закрыть целый раздел можно одной строкой в layout.tsx — тогда все вложенные страницы автоматически получат noindex:

TypeScript
1
2
3
4
// src/app/(dashboard)/layout.tsx

export const metadata: Metadata = {

  robots: { index: false, follow: false },

};

Это закрывает /dashboard, /profile, /settings и всё что внутри сразу.

Для отдельных страниц — то же самое в page.tsx:

TypeScript
1
2
3
4
// src/app/admin/page.tsx

export const metadata = {

  robots: { index: false, follow: false },

};

Проверить что страница закрыта можно в браузере через Ctrl+U → найти <meta name="robots" content="noindex">. Или через Google Search Console → Проверка URL.


4. Подтверждение сайта

Шаг 1 — скачать файл верификации

В Google Search Console и Яндекс Вебмастер выберите метод «HTML-файл» и скачайте файл.

Шаг 2 — положить в public/

CODE
1
2
3
4
5
public/

  google123abc456def.html      Google

  yandex_12345abcdef.html      Яндекс

  favicon.svg

  favicon.ico

Файлы из public/ доступны по корневому URL автоматически — никакой настройки не нужно. После деплоя https://ваш-домен.ru/google123abc456def.html откроется сразу.

Шаг 3 — задеплоить и подтвердить

  1. 1.Закоммитить файлы → задеплоить
  2. 2.Нажать «Подтвердить» в панели каждого поисковика

5. Яндекс.Метрика — ускоряет индексацию

Счётчик Метрики не просто аналитика — Яндекс заметно быстрее индексирует сайты где он установлен, потому что видит реальный трафик. Без счётчика индексация может занять 1–2 недели, с ним — 1–3 дня.

TSX
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// src/app/layout.tsx

import Script from 'next/script';



// Внутри <body>:

<Script id="yandex-metrika" strategy="lazyOnload">

  {`(function(m,e,t,r,i,k,a){

    m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};

    m[i].l=1*new Date();

    k=e.createElement(t),a=e.getElementsByTagName(t)[0];

    k.async=1;k.src=r;a.parentNode.insertBefore(k,a)

  })(window,document,"script","https://mc.yandex.ru/metrika/tag.js","ym");

  ym(XXXXXXXX,"init",{

    clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true

  });`}

</Script>

Где XXXXXXXX — номер счётчика из metrika.yandex.ru.


6. Отправить Sitemap в индексацию

Самый важный шаг — без этого поисковики могут неделями не находить страницы.

**Google Search Console:** Индексирование → Файлы Sitemap → Добавить https://ваш-домен.ru/sitemap.xmlОтправить

**Яндекс Вебмастер:** Индексирование → Файлы Sitemap → Добавить → https://ваш-домен.ru/sitemap.xmlДобавить


Чеклист

  • https://ваш-домен.ru/robots.txt открывается
  • https://ваш-домен.ru/sitemap.xml открывается с нужными страницами
  • Закрытые разделы (/dashboard/, /admin/) имеют robots: { index: false }
  • HTML-файлы верификации в public/ и задеплоены
  • Сайт подтверждён в Google Search Console
  • Сайт подтверждён в Яндекс Вебмастер
  • Счётчик Яндекс.Метрики установлен
  • Sitemap отправлен в обе панели в разделе Индексирование

Сроки: Google ~1–7 дней, Яндекс ~1–3 дня (быстрее если есть Метрика).


Вопросы — пишите в комментарии 👇

Комментарии (0)

Ответить без регистрации

Изображения, PDF, TXT • Ctrl+V для скриншота • до 5 файлов, 10 MB
Пока нет комментариев. Будьте первым!