Настройка сайта для SEO
SEO для Next.js на RelaxDev — полный гайд
Всё что нужно сделать чтобы сайт попал в поисковики. Специфика Next.js App Router — robots и sitemap через TypeScript файлы в папке app/, файлы верификации — в public/.
1. robots.txt
Создайте src/app/robots.ts — Next.js автоматически отдаст его по адресу /robots.txt:
// 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:
// 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):
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:
// src/app/(dashboard)/layout.tsx
export const metadata: Metadata = {
robots: { index: false, follow: false },
};Это закрывает /dashboard, /profile, /settings и всё что внутри сразу.
Для отдельных страниц — то же самое в page.tsx:
// 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/
public/
google123abc456def.html ← Google
yandex_12345abcdef.html ← Яндекс
favicon.svg
favicon.icoФайлы из public/ доступны по корневому URL автоматически — никакой настройки не нужно. После деплоя https://ваш-домен.ru/google123abc456def.html откроется сразу.
Шаг 3 — задеплоить и подтвердить
- 1.Закоммитить файлы → задеплоить
- 2.Нажать «Подтвердить» в панели каждого поисковика
5. Яндекс.Метрика — ускоряет индексацию
Счётчик Метрики не просто аналитика — Яндекс заметно быстрее индексирует сайты где он установлен, потому что видит реальный трафик. Без счётчика индексация может занять 1–2 недели, с ним — 1–3 дня.
// 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 дня (быстрее если есть Метрика).
Вопросы — пишите в комментарии 👇