Добавляем sitemap.xml в Next.js приложение

Инструкция по добавлению sitemap.xml в Next.js приложение.

Добавляем sitemap.xml в Next.js приложение
Дата публикации
14.03.25
Дата обновления
16.05.26
Время чтения
9 мин.

Важным элементом SEO-оптимизации является наличие файла sitemap.xml. В этой статье вы узнаете, что такое sitemap.xml и как добавить его в свое приложение на Next.js.

Если вы разбираетесь не с реализацией в коде, а с тем, зачем sitemap.xml нужен бизнесу, какие страницы стоит включать в карту сайта и какие ошибки мешают индексации, начните с общей статьи Sitemap.xml для сайта: что это, зачем нужен и как не допустить ошибок. А ниже — уже практическая инструкция именно для проектов на Next.js.

Что такое sitemap.xml?

Sitemap.xml - это файл формата Sitemaps XML format, который сообщает поисковым системам (например Google или Yandex), какие страницы есть на вашем сайте и как часто они обновляются.

Этот файл должен находиться в корневой папке вашего сайта, и обычно доступен по адресу:

http(s)://домен.зона/sitemap.xml

Например, sitemap.xml этого блога лежит по адресу https://baranov.guru/sitemap.xml и выглядит следующим образом:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://baranov.guru/</loc>
    <lastmod>2025-03-13T12:07:00.337Z</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.7</priority>
  </url>
  ...
</urlset>

Более подробную информацию о том как как поисковые системы обрабатывают файлы sitemap.xml можно найти в справке от Яндекса или документации Google.

Первый способ: Добавляем статический файл

Первый способ - очень простой. Next.js из коробки умеет отдавать статические файлы, например изображения, добавленные в папку public в корне проекта.

Этот же подход можно использовать для добавления файла sitemap.xml. Всё что необходимо сделать - добавить файл в папку public.

Подробнее про работу со статикой и папку public можно почитать в официальной документации Next.js.

Как видите, способ действительно очень простой, но подойдёт он вам только в случае, если у вас небольшой сайт, с редко меняющимся содержимым. В противном случае лучше прибегнуть к динамической генерации sitemap.xml.

Альтернативный способ добавления статического файла

Начиная с версии 13.3 Next.js умеет корректно обрабатывать статический файл sitemap.xml лежащий в корне папки app.

Подробнее в документации.

Второй способ: Динамическая генерация sitemap.xml

Для того чтобы динамически создавать файл sitemap.xml необходимо в папку app добавить файл robots.js или robots.ts, который будет возвращать объект типа MetadataRoute.Sitemap.

import { MetadataRoute } from "next";

import { URL_BASE } from "@/lib/constants";

export default function sitemap(): MetadataRoute.Sitemap {
  return [
    {
      url: `${URL_BASE}/`,
      lastModified: new Date(),
      changeFrequency: "daily",
      priority: 0.7,
    },
    {
      url: `${URL_BASE}/about/`,
      lastModified: new Date(),
      changeFrequency: "daily",
      priority: 0.7,
    },
    {
      url: `${URL_BASE}/posts/`,
      lastModified: new Date(),
      changeFrequency: "daily",
      priority: 0.7,
    },
  ];
}

Данный код сгенерирует файл со следующим содержимым:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://baranov.guru/</loc>
    <lastmod>2025-03-13T12:07:00.337Z</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://baranov.guru/about/</loc>
    <lastmod>2025-03-13T12:07:00.337Z</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.7</priority>
    </url>
  <url>
    <loc>https://baranov.guru/posts/</loc>
    <lastmod>2025-03-13T12:07:00.337Z</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.7</priority>
  </url>
</urlset>

Генерация Image Sitemaps

Так же, начиная с 15 версии в Next.js есть встроенная возможность генерировать Image Sitemaps. Для этого надо всего лишь добавить свойство images (см. спецификацию) к странице.

import { MetadataRoute } from "next";

import { URL_BASE } from "@/lib/constants";

export default function sitemap(): MetadataRoute.Sitemap {
  return [
    {
      url: `${URL_BASE}/`,
      lastModified: new Date(),
      changeFrequency: "daily",
      priority: 0.7,
      images: ["https://baranov.guru/assets/authors/avatar.webp"],
    },
  ];
}

В результате получим следующий файл:

<urlset
  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
>
  <url>
    <loc>https://baranov.guru/</loc>
    <image:image>
      <image:loc>https://baranov.guru/assets/authors/avatar.webp</image:loc>
    </image:image>
    <lastmod>2025-03-13T12:07:00.337Z</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.7</priority>
  </url>
</urlset>

Генерация Video Sitemaps

Так же, начиная с 15 версии в Next.js есть встроенная возможность генерировать Video Sitemaps. Для этого надо всего лишь добавить свойство videos (см. спецификацию) к странице.

import { MetadataRoute } from "next";

import { URL_BASE } from "@/lib/constants";

export default function sitemap(): MetadataRoute.Sitemap {
  return [
    {
      url: `${URL_BASE}/posts/yandex-gpt-intro/`,
      lastModified: new Date(),
      changeFrequency: "daily",
      priority: 0.7,
      videos: [
        {
          title: "Название видео",
          thumbnail_loc:
            "https://baranov.guru/assets/posts/yandex-gpt-intro/cover.webp",
          description: "Это описание видео",
        },
      ],
    },
  ];
}

В результате получим следующий файл:

<urlset
  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"
>
  <url>
    <loc>https://baranov.guru/posts/yandex-gpt-intro/</loc>
    <video:video>
      <video:title>Название видео</video:title>
      <video:thumbnail_loc>https://baranov.guru/assets/posts/yandex-gpt-intro/cover.webp</video:thumbnail_loc>
      <video:description>Это описание видео</video:description>
    </video:video>
    <lastmod>2025-03-13T12:07:00.337Z</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.7</priority>
  </url>
</urlset>

Генерация локализованных Sitemaps

В Next.js есть встроенная возможность добавлять ссылки на версии страниц на другом языке при генерации sitemap.xml. Для этого надо всего лишь добавить свойство alternates (см. спецификацию) к странице.

import { MetadataRoute } from "next";

import { URL_BASE } from "@/lib/constants";

export default function sitemap(): MetadataRoute.Sitemap {
  return [
    {
      url: `${URL_BASE}/`,
      lastModified: new Date(),
      changeFrequency: "daily",
      priority: 0.7,
      alternates: {
        languages: {
          en: `${URL_BASE}/en/`,
          fr: `${URL_BASE}/fr/`,
        },
      },
    },
  ];
}

В результате получим следующий файл:

<urlset
  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
>
  <url>
    <loc>https://baranov.guru/</loc>
    <xhtml:link
      rel="alternate"
      hreflang="en"
      href="https://baranov.guru/en/"/>
    <xhtml:link
      rel="alternate"
      hreflang="fr"
      href="https://baranov.guru/fr/"/>
    <lastmod>2025-03-13T12:07:00.337Z</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.7</priority>
  </url>
</urlset>

Спецификация MetadataRoute.Sitemap

Вот полная спецификация MetadataRoute.Sitemap, взятая из официального репозитория на Github.

type Sitemap = Array<{
  url: string;
  lastModified?: string | Date | undefined;
  changeFrequency?:
    | "always"
    | "hourly"
    | "daily"
    | "weekly"
    | "monthly"
    | "yearly"
    | "never"
    | undefined;
  priority?: number | undefined;
  alternates?:
    | {
        languages?: Languages<string> | undefined;
      }
    | undefined;
  images?: string[] | undefined;
  videos?: Videos[] | undefined;
}>;

export type Videos = {
  title: string;
  thumbnail_loc: string;
  description: string;
  content_loc?: string | undefined;
  player_loc?: string | undefined;
  duration?: number | undefined;
  expiration_date?: Date | string | undefined;
  rating?: number | undefined;
  view_count?: number | undefined;
  publication_date?: Date | string | undefined;
  family_friendly?: "yes" | "no" | undefined;
  restriction?: Restriction | undefined;
  platform?: Restriction | undefined;
  requires_subscription?: "yes" | "no" | undefined;
  uploader?:
    | {
        info?: string | undefined;
        content?: string | undefined;
      }
    | undefined;
  live?: "yes" | "no" | undefined;
  tag?: string | undefined;
};

Альтернативные решения

Так же есть несколько альтернативных решений для генерации sitemap.xml в виде npm-пакетов. Например пакет next-sitemap.

Бонус: Валидация sitemap.xml

Для того чтобы удостовериться что содержимое sitemap.xml валидно и будет работать как и задумано, можно воспользоваться несколькими бесплатными инструментами:

На этом всё! 🎉

Расскажите о вашем проекте

Связаться иначе

Часто задаваемые вопросы

Файл подсказывает поисковикам (Google, Яндекс), какие URL есть на сайте и когда страницы обновлялись. Это не гарантия попадания в индекс, но упрощает обход, особенно у больших сайтов и блогов с множеством статей.

Обычно в корне сайта, по адресу https://ваш-домен/sitemap.xml. В Next.js — либо файл в папке public, либо маршрут из app/sitemap.ts (см. способы в статье).

Статика в public — для небольшого сайта с редкими изменениями: положили XML и забыли. app/sitemap.ts — когда страницы появляются часто (посты, теги): список URL собирается при сборке или запросе из кода.

В app/sitemap.ts получите посты (как в статье про RSS) и верните массив { url, lastModified, ... } для каждого slug. Так lastmod будет соответствовать дате публикации, а не одной дате на весь сайт.

Желательно: строка Sitemap: https://ваш-домен/sitemap.xml помогает роботам быстрее найти карту. Как добавить robots.txt в Next.js — в статье robots.txt.

Да, в Next.js 15+ в том же MetadataRoute.Sitemap можно передать поля images и videos для Image/Video Sitemaps. Подробности — в разделах статьи про изображения и видео.

Можно использовать наш валидатор, а также инструменты в Google Search Console и Яндекс Вебмастер. Раздел валидация в статье.

Вам может быть интересно

Sitemap.xml для сайта: что это, зачем нужен и как не допустить ошибок
Sitemap.xml для сайта: что это, зачем нужен и как не допустить ошибок

Sitemap.xml для сайта: что это, зачем нужен и как не допустить ошибок

18 мин.

Разбираемся, что такое sitemap.xml, когда карта сайта действительно нужна бизнесу, какие страницы должны в нее попадать и как проверить, что она помогает индексации, а не отправляет поисковиков в технический мусор.

Пост#seo#sitemap.xml
Добавляем robots.txt в Next.js приложение
Добавляем robots.txt в Next.js приложение

Добавляем robots.txt в Next.js приложение

5 мин.

Инструкция по добавлению robots.txt в Next.js приложение...

Пост#nextjs#seo
Добавляем Not Found (404) страницу в Next.js приложение
Добавляем Not Found (404) страницу в Next.js приложение

Добавляем Not Found (404) страницу в Next.js приложение

3 мин.

Инструкция по добавлению Not Found (404) страницы в Next.js приложение...

Пост#nextjs#seo
Добавляем JSON-LD разметку к блогу на Next.js
Добавляем JSON-LD разметку к блогу на Next.js

Добавляем JSON-LD разметку к блогу на Next.js

9 мин.

Инструкция по добавлению JSON-LD разметки к блогу на Next.js...

Пост#nextjs#seo
Добавляем Google Analytics в Next.js приложение
Добавляем Google Analytics в Next.js приложение

Добавляем Google Analytics в Next.js приложение

2 мин.

Инструкция по добавлению Google Analytics в Next.js приложение...

Пост#seo#nextjs
Добавляем Яндекс Турбо-страницы к блогу на Next.js
Добавляем Яндекс Турбо-страницы к блогу на Next.js

Добавляем Яндекс Турбо-страницы к блогу на Next.js

5 мин.

Для того чтобы красиво отображаться в поисковой выдаче Яндекса решили добавить Яндекс Турбо-страницы к блогу...

Пост#nextjs#yandex
Валидатор sitemap.xml
Валидатор sitemap.xml

Валидатор sitemap.xml

Проверьте sitemap.xml: корректность структуры urlset/sitemapindex, замечания по полям и сводка по URL — прямо в браузере.

Инструмент#seo#sitemap
Валидатор robots.txt
Валидатор robots.txt

Валидатор robots.txt

Проверьте robots.txt: разбор правил, замечания по RFC 9309, список sitemap и групп user-agent — прямо в браузере.

Инструмент#seo#robots
Техническая SEO-оптимизация сайта
Техническая SEO-оптимизация сайта

Техническая SEO-оптимизация сайта

Находим и исправляем технические ограничения, которые мешают поисковикам обходить, индексировать и ранжировать важные страницы сайта.

Услуга#seo#technical-seo