SEO-оптимизация4 мин чтения

Sitemap Next JS: как настроить карту сайта в App Router

Sitemap Next JS не появляется сам по себе: в отличие от WordPress, где карту делает плагин, на Next.js её нужно описать в коде. Разбираем, как сделать это без лишних зависимостей и какие ошибки чаще всего мешают индексации.

Почему на Next.js карту сайта делают в коде

Если сайт компании в Ташкенте сделан на Next.js, в админке не найти кнопку «создать карту». Фреймворк отвечает за рендеринг страниц, а список адресов для поисковиков формирует сам разработчик. Это чуть больше работы на старте, зато карта строится из тех же данных, что и сам сайт, и не расходится с реальностью.

Для бизнеса это важно по простой причине: Google и Яндекс находят новые страницы быстрее, когда видят их в sitemap.xml. Для интернет-магазина с каталогом или блога, который пополняется статьями, карта становится рабочим инструментом, а не формальностью.

Sitemap Next JS в App Router: встроенный способ

В современном App Router в папку app добавляется специальный файл sitemap (обычно sitemap.ts). Он экспортирует функцию, которая возвращает массив объектов. В каждом объекте есть адрес страницы, дата изменения и, при желании, частота обновления и приоритет. Фреймворк сам превращает этот массив в корректный XML и отдаёт его по адресу /sitemap.xml.

В старом Pages Router обычно делают отдельный маршрут, который собирает XML вручную, либо подключают пакет, генерирующий карту при сборке. Если проект ещё живёт на Pages Router, это рабочий вариант, но при переезде на App Router стоит перейти на встроенный механизм.

Главное правило: источник данных для карты должен совпадать с источником данных для страниц. Статьи, товары и карточки услуг берутся из базы, headless CMS или файлов с контентом, и функция карты обращается к тому же месту. Тогда новая публикация попадает в карту без ручной правки.

Что включать в карту, а что нет

Статические страницы — главную, услуги, контакты, о компании — можно перечислить списком. Динамические запрашиваются из источника данных. Берите только опубликованные записи: черновики и материалы на модерации в карте не нужны.

  • Не включайте страницы с noindex.
  • Не добавляйте адреса с параметрами, фильтрами и сортировкой.
  • Исключите служебные маршруты: API, авторизация, личный кабинет, предпросмотр черновиков.
  • Уберите адреса, которые перенаправляют на другие страницы или отдают 404.
  • Для магазина на Click или Payme не включайте страницы корзины и оплаты.

Даты изменения, обновление и большие сайты

В поле даты указывайте реальную дату обновления записи из базы или CMS. Частая ошибка — подставлять текущее время для всех адресов. Поисковик видит, что весь сайт «меняется» каждый день, и перестаёт доверять этому полю.

Актуальность зависит от режима рендеринга. Если карта генерируется статически при сборке, новая статья появится в ней только после следующего деплоя. Для блога с публикациями раз в неделю этого достаточно. Для каталога, где товары добавляются и снимаются каждый день, лучше динамическая генерация с кешированием или заданный интервал повторной генерации.

У одного файла карты есть ограничения по протоколу: на число адресов и на размер. Для крупных сайтов Next.js позволяет разбить карту на несколько частей функцией generateSitemaps: она возвращает список идентификаторов, и под каждый создаётся свой файл, например отдельно статьи и отдельно товары. В Search Console и Яндекс Вебмастер добавляйте все части или индексный файл.

Русская и узбекская версии в одной карте

Большинство сайтов в Узбекистане работает минимум на двух языках. В объектах карты можно указать альтернативные языковые адреса: это дублирует hreflang в коде страниц и помогает поисковикам связать русскую и узбекскую версии. Следите, чтобы обе версии реально существовали и отвечали кодом 200, а hreflang в карте совпадал с hreflang на странице.

robots.txt и ловушка с базовым адресом

Файл robots создаётся так же, как карта: файлом robots.ts в папке app. В нём указывают адрес sitemap.xml и правила для служебных маршрутов. Проверьте, что на тестовом и превью-доменах индексация закрыта, а на основном домене открыта. Перепутанные окружения — частая причина, по которой сайт выпадает из поиска.

Вторая ловушка — домен. Его обычно берут из переменной окружения. Если на рабочем сервере переменная не задана, в карте окажутся адреса с localhost или техническим доменом хостинга, и поисковик их отбросит. После каждого крупного деплоя открывайте карту и смотрите первые строки.

Как проверить карту и что делать дальше

Проверка занимает несколько минут, но экономит недели ожидания индексации.

  • Откройте /sitemap.xml на рабочем домене и убедитесь, что XML читается.
  • Проверьте, что адреса абсолютные и с правильным доменом.
  • Выборочно проверьте код ответа нескольких адресов.
  • Опубликуйте тестовую запись и посмотрите, появилась ли она в карте.
  • Добавьте карту в Search Console и Яндекс Вебмастер и изучите статус обработки.

Частые вопросы

Нужен ли пакет для sitemap в Next.js?

В App Router обычно нет: достаточно файла sitemap в папке app, который возвращает список адресов. Сторонние пакеты чаще нужны на Pages Router.

Почему новые страницы не появляются в sitemap?

Скорее всего, карта сгенерирована статически при сборке. Она обновится после нового деплоя, либо настройте динамическую генерацию или интервал повторной генерации.

Что делать, если в sitemap попал localhost?

Проверьте переменную окружения с адресом сайта на рабочем сервере. Она не задана или указывает на тестовый домен. Исправьте её и пересоберите проект.

Нужно ли добавлять узбекские и русские страницы отдельно?

Можно перечислить каждую версию отдельной записью или указать альтернативные языковые адреса внутри записи. В обоих случаях адреса должны отвечать кодом 200 и совпадать с hreflang на страницах.

Разберём вашу задачу бесплатно

Оставьте контакт — за 15 минут созвона покажем, где теряются заявки и что сделать в первую очередь.