Одна карта сайта большого каталога перестала помещаться в допустимый размер, а после разбиения часть товаров исчезла из XML. Разделение файла само по себе не решает задачу: нужно сохранить полный набор нужных адресов и возможность проверить, в какую часть попал каждый товар.
Ниже собственный учебный пример Next.js 15 с App Router. У опубликованных товаров есть числовой внутренний ID и публичный slug. Мы распределяем адреса по устойчивым диапазонам ID. Для другого формата идентификаторов можно хранить назначенную группу отдельно; не нужно превращать UUID в номер случайным способом.
Когда стоит разделять карту сайта
У sitemap есть ограничение на число URL и размер файла без сжатия: до 50 000 адресов и до 50 МБ. Если превышен любой предел, файл следует разделить. Большой каталог может упереться в размер раньше, особенно при дополнительных данных и языковых вариантах. Правила Google для sitemap.
Не обязательно дожидаться предела. Несколько понятных частей удобно обслуживать по типам содержимого или устойчивым группам товаров. Однако десятки пустых файлов не добавляют полезных адресов. Сначала посчитайте именно опубликованные страницы, которые собираетесь включать, и измерьте фактический XML.
Составьте правила включения. Например, в учебную карту входят опубликованные карточки с основным адресом на production-домене. Черновики, личные разделы, временные фильтры и ответы «товар не найден» исключены. Товар без наличия не обязательно удалён: решение зависит от того, остаётся ли его страница полезной и доступной.
Выберите устойчивое распределение товаров
Простая нумерация «первые 10 000 строк, следующие 10 000» зависит от сортировки и состава списка. После удаления раннего товара граница сдвигается. Это не обязательно нарушает sitemap, но затрудняет поиск пропуска, сверку частей и воспроизводимое сравнение.
В нашем примере группа определяется как целая часть ID / 10 000. Группа 0 содержит ID от 0 включительно до 10 000 не включительно, группа 1 — от 10 000 до 20 000. Такое правило сохраняет место товара при публикации соседних карточек. Верхняя граница не должна входить в обе части одновременно.
Не вычисляйте количество групп только по количеству опубликованных товаров. Если ID имеют пропуски, товар с ID 95 000 будет пропущен, если объявить только первую группу на основании короткого списка. Список существующих групп формируют из реальных опубликованных ID. При этом пустые группы можно не объявлять.
Используйте generateSitemaps для версии 15
В Next.js 15 generateSitemaps объявляет идентификаторы частей, а функция sitemap получает id: number. Адреса частей имеют вид /catalog/sitemap/0.xml. Это отличается от примеров для иных основных версий; проверяйте документацию установленного пакета. Справка generateSitemaps для версии 15.
Учебный файл app/catalog/sitemap.ts ниже использует два адаптера источника. Их необходимо реализовать в своём проекте. Первый возвращает существующие группы опубликованных товаров, второй — опубликованные строки указанного полуоткрытого диапазона. Оба должны пользоваться одинаковыми правилами публикации.
import type { MetadataRoute } from 'next'
import {
listPublishedSitemapGroups,
publishedProductsInRange,
} from '@/lib/catalog-sitemap-source'
const GROUP_SIZE = 10_000
const PUBLIC_ORIGIN = 'https://shop.example.ru'
export async function generateSitemaps() {
const groups: number[] = await listPublishedSitemapGroups(GROUP_SIZE)
return groups.map((id) => ({ id }))
}
export default async function sitemap({ id }: {
id: number
}): Promise<MetadataRoute.Sitemap> {
const rows = await publishedProductsInRange({
fromInclusive: id * GROUP_SIZE,
toExclusive: (id + 1) * GROUP_SIZE,
})
return rows.map((product) => ({
url: new URL(`/catalog/${encodeURIComponent(product.slug)}`, PUBLIC_ORIGIN).href,
lastModified: product.publicContentUpdatedAt,
}))
}Домен в коде условный: замените его согласованным основным доменом. publicContentUpdatedAt означает дату существенного обновления публичной карточки, а не дату получения файла sitemap. Изменение складской записи, не повлиявшее на страницу, не обязано менять эту дату. Проверку корректности полей нужно выполнить в адаптере до формирования XML.
Сделайте части доступными для обнаружения
Создание маршрутов частей не означает, что поисковый робот уже знает их адреса. Подготовьте индекс sitemap со ссылками на существующие части либо передайте нужные карты через инструменты поисковой системы. Проверьте, как карта объявляется в robots.txt вашего проекта.
generateSitemaps не следует считать обещанием готового общего индекса со всеми другими картами сайта. Откройте фактический адрес индекса и сравните его ссылки с объявленными группами. Если отдельные разделы блога или услуг имеют свои карты, они тоже требуют согласованного способа обнаружения.
Проверьте протокол и домен каждого URL. Карта production не должна содержать preview-адреса только потому, что сборка получила переменную окружения со стенда. Начните с нескольких карточек из разных частей, затем выполните полную машинную сверку. Ошибочный домен в тысячах записей лучше выявить до передачи файла роботу.
Сверьте набор адресов, а не только количество
Для приёмки сохраните эталонный список опубликованных карточек из источника на определённый момент. Получите все части sitemap и объедините их URL. Затем сравните множества: что отсутствует, что лишнее и что встречается больше одного раза. Равное количество записей не доказывает равенство списков.
Обязательно включите товары на границах диапазонов: ID 9 999, 10 000 и 10 001. Добавьте товар с большим ID после длинного разрыва и проверьте, появилась ли нужная группа. Проверьте снятие с публикации: карточка исчезает из объявленного набора без удаления остальных товаров её группы.
Если каталог меняется во время обхода всех частей, сверка может сравнить разные состояния. Зафиксируйте версию экспорта или выполните проверку при стабильном наборе. Не называйте возникший разрыв доказанной ошибкой разделения, пока не исключили параллельное изменение данных.
Отдельно проверьте статус и тип содержимого каждого файла, валидность XML, размер без сжатия и лимит адресов. Нельзя принимать HTML-шаблон ошибки с названием sitemap.xml за карту сайта. Также выберите реальные карточки из каждой части и откройте их: правильный XML может перечислять неправильные страницы.
Как поддерживать карту после исправления
В задаче разработчику сохраните размер группы, условия включения, способ получения списка групп и критерии изменения lastModified. Эти правила должны быть общими для индекса и отдельных частей. Иначе обновление источника добавит новую часть, а индекс продолжит объявлять старый список.
После публикации получите карту прямым запросом и выполните техническую проверку страницы для контрольных URL. Аудит страницы не заменяет полную сверку тысяч адресов sitemap. Проверка списка — отдельный этап, результаты которого стоит приложить к задаче.
Карта дополняет ссылки самого каталога. Если карточки доступны только из XML, пересмотрите вывод товаров и ссылок на серверной странице. Основные механизмы приложения собраны в руководстве по Next.js 15.
После изменения следите за обработкой карт в панели вебмастера. Отправка sitemap помогает сообщить об адресах, но не гарантирует их индексацию. Подтверждённый результат этой работы — полный, корректный и доступный набор нужных URL с понятным способом обновления.