Помощь и вопросы

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

relaxdev
relaxdev
3 дня назад
23

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 дня (быстрее если есть Метрика).


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

Нет ответов

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

Изображения, PDF, TXT • Ctrl+V для скриншота • до 5 файлов, 10 MB