Skip to content
EN
← Все статьи

Sitemap XML: структура карты сайта, лимиты, генерация и проверка

Коротко. Sitemap.xml — это машиночитаемый список канонических URL сайта в формате протокола sitemaps.org. Он подсказывает роботу, что обойти, но не гарантирует индексацию и не является фактором ранжирования. Один файл вмещает до 50 000 URL и 50 МБ в несжатом виде, дальше нужен sitemap index. Теги changefreq и priority поисковики де-факто игнорируют, lastmod учитывается только тогда, когда датам можно верить.

Что такое sitemap.xml и кому он реально нужен

XML-карта сайта — обычный текстовый файл в кодировке UTF-8, который перечисляет адреса страниц по единой схеме, описанной в протоколе sitemaps.org версии 0.9. Формат не менялся с 2005 года и одинаково понимается Google, Яндексом, Bing и остальными краулерами: это один из немногих действительно универсальных стандартов в SEO.

Базовый способ обнаружения страниц у робота — переход по ссылкам. Он берёт известный URL, скачивает HTML, вытаскивает все href и ставит найденное в очередь. Sitemap — второй, независимый канал обнаружения: список адресов, который не требует, чтобы до страницы существовал путь по ссылкам.

Отсюда следует, кому карта сайта даёт заметный эффект:

  • Крупные каталоги и магазины. Десятки и сотни тысяч URL, глубокая вложенность, часть карточек доступна только через фильтры и пагинацию — робот физически не дойдёт до всего за разумное число обходов.
  • Новые сайты без внешних ссылок. Обнаруживать нечего: внешних сигналов нет, внутренняя перелинковка ещё пустая.
  • Сайты со слабой внутренней структурой. Разделы, на которые не ведёт ни одна ссылка из меню и листингов — «сироты» в терминах технического аудита.
  • Медиа и новостные проекты. Контент устаревает за часы, скорость обнаружения важнее всего остального.
  • Мультиязычные проекты. Разметку hreflang удобнее вести в sitemap, чем править в <head> каждой страницы.

И кому она почти бесполезна: сайту на 30–80 страниц, где всё связано сквозным меню и хлебными крошками. Такой сайт робот обходит целиком за один заход. Файл не навредит, но и не решит ни одной проблемы — если страницы не в индексе, причина в другом, и разбирать её надо по сценарию из материала почему сайта нет в поиске.

Что sitemap делает и чего он НЕ делает

Это самая частая точка заблуждений, поэтому разберём прямо.

Что sitemap действительно делает

  • Сообщает роботу список адресов. Один запрос — тысячи URL, вместо обхода по цепочке ссылок.
  • Передаёт дату изменения — если вы её честно проставляете. Это позволяет роботу приоритизировать перечитывание изменившегося.
  • Ускоряет обнаружение новых и глубоко лежащих страниц. Обнаружение — не индексация, но без него индексации не будет вовсе.
  • Даёт диагностику. В панелях вебмастеров видно «отправлено» против «проиндексировано» по каждому файлу. Это единственный простой способ померить, какая доля вашего контента реально попала в индекс.

Чего sitemap не делает

  • Не гарантирует индексацию. Наличие URL в файле — приглашение, а не обязательство. Робот сам решает, обходить ли и стоит ли страница места в индексе.
  • Не влияет на ранжирование. Ни один тег протокола не является фактором ранжирования. priority — приоритет внутри вашего сайта для очереди обхода, а не «вес» страницы в выдаче.
  • Не отменяет robots.txt и noindex. Если URL закрыт от обхода в robots.txt или помечен noindex, включение в sitemap ничего не изменит — только создаст конфликт сигналов.
  • Не заменяет внутреннюю перелинковку. Ссылочная структура передаёт вес и объясняет иерархию; sitemap не делает ни того, ни другого.
  • Не чинит дубли. За выбор канонической версии отвечает rel="canonical" и настройки хоста, а не карта сайта.
  • Не переиндексирует по требованию. Отправка файла не запускает немедленный обход всех URL.
Правило. Sitemap — подсказка к обходу. Если страница плохая, дублирующая или технически недоступная, попадание в sitemap не улучшит её судьбу. Наоборот: массовое добавление мусора размывает сигнал и портит собственную диагностику — вы перестанете понимать, что именно у вас не индексируется.
Схема: робот обнаруживает страницы двумя каналами — по ссылкам и через sitemap.xml
Sitemap — второй, независимый от ссылок канал обнаружения страниц. Именно обнаружения, а не индексации.

Структура sitemap.xml: urlset, url, loc, lastmod, changefreq, priority

Минимально корректный файл выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.com/</loc>
    <lastmod>2026-07-14</lastmod>
  </url>
  <url>
    <loc>https://example.com/catalog/okna/</loc>
    <lastmod>2026-06-28T11:20:00+03:00</lastmod>
  </url>
  <url>
    <loc>https://example.com/about/</loc>
  </url>
</urlset>

Здесь важны четыре вещи. Первая — XML-декларация в самой первой строке, без пробелов и пустых строк перед ней. Вторая — атрибут xmlns у корневого элемента: это идентификатор пространства имён, а не адрес, по которому что-то скачивается, поэтому переписывать его на https:// нельзя — файл перестанет распознаваться как sitemap. Третья — внутри одного <url> ровно один <loc>. Четвёртая — необязательные теги можно просто не выводить, как в третьей записи выше.

Как теги учитываются на самом деле

ТегОбязателенКак реально учитываетсяТиповая ошибка
<urlset>ДаКорневой элемент. Без правильного namespace документ не будет распознан как карта сайтаNamespace потерян, переписан на https или заменён «похожим» — файл читается как произвольный XML
<url>ДаКонтейнер одной записи. Ровно один <loc> внутриДва <loc> в одной записи или запись без <loc> вовсе
<loc>ДаЕдинственное, что читают все поисковики без исключений. Абсолютный URL той же схемы и того же хоста, что и сам файлhttp-адрес на https-сайте, относительный путь, неэкранированный &, кириллица без percent-encoding
<lastmod>НетУчитывается, только если датам можно доверять. Google явно оговаривает: значение используется, когда оно последовательно и проверяемо точное. В индексном файле — самый полезный тег: показывает, какой из файлов имеет смысл перечитатьПодставляется время генерации файла, а не дата изменения контента — и весь сайт «обновляется» каждую ночь
<changefreq>НетGoogle игнорирует полностью. Остальные краулеры — в лучшем случае как очень слабую подсказку. Реальную частоту обхода определяет поведение сайта, а не декларацияdaily у всех страниц «чтобы чаще заходили» — сигнал обесценивается за неделю
<priority>НетGoogle игнорирует. Значение относительное внутри одного сайта и никогда не было фактором ранжирования1.0 у всех URL, что математически эквивалентно отсутствию приоритета
<xhtml:link>НетРасширение для hreflang. Google читает; удобнее централизованной правки в <head>Нет самоссылки, набор альтернатив в разных записях не совпадает
<sitemapindex> / <sitemap>Только в индексеКорневой элемент и запись индексного файла. Внутри — <loc> на обычный sitemap и опционально <lastmod>Индекс, ссылающийся на другой индекс, и смешение <url> с <sitemap> в одном файле

Про lastmod подробно

Формат — W3C Datetime: допустимо и короткое 2026-07-14, и полное 2026-07-14T09:15:00+03:00 с указанием часового пояса. Смешивать оба варианта в одном файле можно, парсер это переварит.

Проблема не в формате, а в достоверности. «Значимым изменением» считается правка основного контента, структурированных данных или ссылок на странице — но не смена года в подвале, не пересборка кеша и не автоматический пересчёт блока «похожие товары». Если генератор ставит lastmod равным времени сборки файла, то через месяц у робота накапливается статистика: даты меняются, содержимое — нет. Дальше сигнал просто перестают учитывать по всему домену, и вернуть доверие сложнее, чем не терять его.

Предупреждение. Честный lastmod у трети страниц полезнее, чем «свежий» lastmod у всех. Если взять дату изменения контента неоткуда — не выводите тег вовсе. Отсутствие сигнала лучше ложного сигнала.

Лимиты протокола: 50 000 URL, 50 МБ и sitemap index

Протокол задаёт два жёстких ограничения на один файл: не более 50 000 URL и не более 50 МБ в несжатом виде (52 428 800 байт). Оба лимита действуют одновременно: файл на 30 000 очень длинных URL с hreflang-разметкой упрётся в мегабайты раньше, чем в количество записей.

Файл можно отдавать сжатым gzip — как sitemap.xml.gz или через Content-Encoding: gzip. Лимит 50 МБ при этом считается по распакованному размеру, так что сжатие экономит трафик, но не поднимает потолок.

Когда URL больше лимита, файлы разбивают и объявляют через индексный:

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://example.com/sitemap-static.xml</loc>
    <lastmod>2026-05-02</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://example.com/sitemap-categories.xml</loc>
    <lastmod>2026-07-10</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://example.com/sitemap-products-1.xml.gz</loc>
    <lastmod>2026-08-04T02:15:00+03:00</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://example.com/sitemap-products-2.xml.gz</loc>
    <lastmod>2026-08-04T02:15:00+03:00</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://example.com/sitemap-articles.xml</loc>
    <lastmod>2026-08-05</lastmod>
  </sitemap>
</sitemapindex>

Индексный файл подчиняется тем же лимитам: до 50 000 записей и до 50 МБ. Формально это даёт потолок в 2,5 млрд URL на хост — на практике до него не доходит никто.

Вложенность индексов

Индексный файл не может ссылаться на другой индексный файл. Двухуровневая схема «индекс → индексы → sitemap» невалидна: поисковик прочитает верхний уровень, увидит внутри не карты, а индексы, и вложенные файлы останутся необработанными. Если разбиение уже переросло один уровень, правильное решение — не городить второй, а отправить несколько независимых индексных файлов (в robots.txt можно перечислить сколько угодно строк Sitemap:).

И ещё одно ограничение: индекс может перечислять только карты того же хоста. Общий индекс на несколько поддоменов работает лишь при подтверждении прав на все хосты в панели вебмастера — подробнее о разнице хостов в материале о поддоменах и подпапках.

Практика. Не упирайтесь в 50 000. Держите потолок шарда на уровне 20 000–45 000 URL: остаётся запас на рост каталога, файлы быстрее собираются и быстрее отдаются, а при ошибке в генерации вы теряете один шард, а не всю карту.
Схема sitemap index: один индексный файл ссылается на несколько карт по типам контента
Индексный файл ссылается только на обычные карты того же хоста. Вложенность «индекс в индексе» протоколом не поддерживается.

Правила URL: абсолютные адреса, один хост, одна схема, экранирование

Абсолютные URL того же хоста и той же схемы

Каждый <loc> — полный адрес с протоколом. Относительные пути вида /catalog/ протоколом не предусмотрены. Схема и хост должны совпадать с адресом самого файла sitemap: карта на https://example.com/sitemap.xml не может содержать http://example.com/... и https://www.example.com/... — для поисковика это другие хосты.

Именно отсюда растёт самый частый запрос про «sitemap xml https». Сценарий типовой: сайт переехал на HTTPS, редиректы настроены, а генератор карты продолжает подставлять старый базовый адрес из конфига или из поля «адрес сайта» в CMS. В результате каждый URL в карте — это лишний хоп через 301, и робот тратит бюджет обхода на редиректы вместо страниц. Как это диагностировать — в разборе 301 против 302 и в общем гайде по редиректам.

Ограничение по каталогу

По протоколу карта влияет только на URL, лежащие «не выше» её собственного каталога: файл на https://example.com/catalog/sitemap.xml вправе перечислять адреса внутри /catalog/, но не /blog/. Есть два законных обхода: положить файл в корень сайта (рекомендуемый вариант) либо объявить его строкой Sitemap: в robots.txt — объявленная в robots.txt карта считается относящейся ко всему хосту.

XML-экранирование и percent-encoding

Внутри <loc> находится XML-значение, а не «просто ссылка». Пять символов обязаны экранироваться: &&amp;, <&lt;, >&gt;, '&apos;, "&quot;. На практике ломает файл почти всегда именно голый амперсанд из URL с параметрами.

Отдельная история — кириллические и любые не-ASCII адреса. Их нужно приводить к percent-encoding по RFC 3986: строка сначала кодируется в UTF-8, затем каждый байт записывается как %XX. Некоторые парсеры простят кириллицу «как есть», но валидатор такой файл забракует, а часть роботов приведёт адрес к другой форме и получит дубль.

# Неверно
<loc>https://example.com/каталог/окна/</loc>
<loc>https://example.com/catalog?a=1&b=2</loc>
<loc>/catalog/okna/</loc>
<loc>http://example.com/catalog/</loc>

# Верно
<loc>https://example.com/%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3/%D0%BE%D0%BA%D0%BD%D0%B0/</loc>
<loc>https://example.com/catalog?a=1&amp;b=2</loc>
<loc>https://example.com/catalog/okna/</loc>
<loc>https://example.com/catalog/</loc>

# Быстро закодировать путь
python3 -c "import sys,urllib.parse; print(urllib.parse.quote(sys.argv[1], safe='/:?=&'))" \
  'https://example.com/каталог/окна/'

Расширения протокола: image, video, news и hreflang

Базовый протокол описывает только адреса. Поверх него существуют расширения — дополнительные пространства имён, которые добавляют метаданные. Подключать их стоит осознанно: каждое расширение раздувает файл и требует поддержки в генераторе.

Карты изображений

Нужны, когда картинки подгружаются скриптами, лежат на отдельном CDN-хосте или являются самостоятельным контентом (фотобанк, каталог, портфолио). Из полей сегодня реально поддерживается только адрес изображения — теги с подписью, заголовком, лицензией и геолокацией объявлены устаревшими и не обрабатываются.

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
  <url>
    <loc>https://example.com/catalog/okna/</loc>
    <image:image>
      <image:loc>https://cdn.example.com/img/okna-1.jpg</image:loc>
    </image:image>
    <image:image>
      <image:loc>https://cdn.example.com/img/okna-2.jpg</image:loc>
    </image:image>
  </url>
</urlset>

Обратите внимание: сами изображения могут лежать на другом хосте — на адреса картинок правило «тот же хост» не распространяется. Ограничение — до тысячи изображений на одну страницу.

Видео-карты

Имеет смысл заводить тем, у кого видео — основной контент: онлайн-кинотеатры, обучающие платформы, видеоблоги. Расширение передаёт заголовок, описание, ссылку на превью, ссылку на плеер или файл, длительность и дату истечения прав. Для сайта с одним роликом на главной затраты не окупаются — достаточно микроразметки на странице.

Новостные карты

Отдельный формат для сайтов, принятых в новостные сервисы. Ключевое ограничение: в файл включаются только материалы, опубликованные за последние двое суток, всё старое из него нужно вычищать. Передаются название издания, язык, дата публикации и заголовок. Часть исторических тегов (жанры, ключевые слова, уровень доступа) больше не обрабатывается.

Для мультиязычных сайтов разметку языковых версий можно вынести из HTML в sitemap. Это удобнее: правки делаются в одном генераторе, а не в шаблонах, и не раздувают <head> каждой страницы (что заодно упрощает работу с title, description и другими метатегами).

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>https://example.com/pricing</loc>
    <xhtml:link rel="alternate" hreflang="ru" href="https://example.com/pricing"/>
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/pricing"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing"/>
  </url>
  <url>
    <loc>https://example.com/en/pricing</loc>
    <xhtml:link rel="alternate" hreflang="ru" href="https://example.com/pricing"/>
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/pricing"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing"/>
  </url>
</urlset>

Два правила, на которых спотыкаются чаще всего. Первое: каждая запись перечисляет все языковые версии, включая саму себя. Второе: связи должны быть взаимными — если русская страница ссылается на английскую, английская обязана ссылаться на русскую. Односторонние связи игнорируются целиком, а не частично.

Что класть в sitemap, а что — нет

Критерий один и он простой: в карте должны быть только те URL, которые вы хотите видеть в индексе как самостоятельные страницы. Формально это три условия одновременно:

  1. URL отдаёт 200 OK — не редирект, не 404, не 403, не 5xx;
  2. URL каноническийrel="canonical" на странице указывает на него самого;
  3. URL индексируемый — не закрыт в robots.txt, нет noindex ни в метатеге, ни в заголовке X-Robots-Tag.

Конфликты, которые обесценивают файл

  • URL закрыт в robots.txt. Робот не может скачать страницу, чтобы проверить её содержимое, но видит адрес в карте. Результат — записи вида «обнаружено, но не проиндексировано» и предупреждение о конфликте в панели вебмастера.
  • Страница с noindex. Прямое противоречие: карта говорит «проиндексируй», метатег — «не индексируй». Побеждает noindex, а карта теряет доверие.
  • Редирект. Каждый такой URL — потраченный впустую запрос робота. На больших сайтах это заметная доля краулингового бюджета.
  • 404 и 410. Явный признак, что карта не пересобиралась после удаления контента.
  • Неканоническая версия. URL с UTM-метками, идентификатором сессии, вариантами сортировки и фильтров, версии с www и без. Все они схлопываются в канонический адрес — в карте им делать нечего.
  • Служебные страницы. Корзина, оформление заказа, личный кабинет, внутренний поиск, страницы благодарности, тестовые и стейджинговые адреса.
  • Пагинация и фасетные фильтры. Спорный случай: если страницы пагинации самоканоничны и несут ценность, их включают; если они схлопываются на первую — нет.
Диагностическое правило. Отношение «проиндексировано / отправлено» имеет смысл, только если в sitemap лежит чистый список. Насыпав туда всё подряд, вы получите условные 20% и не сможете отличить проблему качества контента от собственного мусора в файле.

Разбиение по типам контента: как sitemap превращается в диагностику

Один общий sitemap.xml на 40 000 URL отвечает на вопрос «сколько проиндексировано» и не отвечает на вопрос «что именно не проиндексировано». Разбиение решает это бесплатно: панели вебмастеров показывают статистику по каждому файлу отдельно.

Практическая схема для магазина: sitemap-static.xml (десяток посадочных), sitemap-categories.xml, sitemap-products-N.xml, sitemap-articles.xml. Если в отчёте видно, что категории проиндексированы на 98%, статьи на 90%, а товары на 34% — вы за минуту локализовали проблему до товарных карточек, вместо того чтобы гадать по всему сайту.

Второй уровень разбиения — по партициям внутри типа. Для товаров удобно резать по диапазонам идентификаторов или по дате добавления: тогда «свежий» шард пересобирается часто, а исторические — редко, и lastmod в индексном файле начинает нести реальную информацию.

Размер и тип сайтаСхема файловКак обновлять
Лендинг, сайт-визитка — до ~100 URLОдин статический sitemap.xml в корнеРуками или при сборке проекта; пересобирать при добавлении страниц
Корпоративный сайт, блог — 100–5 000 URLОдин sitemap.xml, либо индекс + два файла: страницы и статьиПлагин CMS или генерация при сборке; суточного крона достаточно
Интернет-магазин — 5 000–50 000 URLИндекс + разбиение по типам: категории, товары, статьи, статикаДинамическая генерация с записью в файлы по крону; товарный файл — чаще остальных
Крупный каталог, маркетплейс — от 50 000 URLИндекс + шардирование по типам и партициям по 20 000–45 000 URLТолько динамическая генерация из БД, инкрементально: пересобирается изменившийся шард, а не весь набор
Новостной сайт, медиаОбычный индекс + отдельная новостная карта (только последние двое суток)Новостной файл — на каждую публикацию; общий — по расписанию
Мультиязычный сайтИндекс + по файлу на язык, hreflang через xhtml:linkГенерация из одного источника данных, чтобы наборы альтернатив не разъезжались между языками
Сайт с поддоменамиСвой sitemap и свой robots.txt на каждом хостеНезависимо друг от друга; общий индекс — только при подтверждении прав на все хосты
Разбиение карты сайта по типам контента и отчёт отправлено против проиндексировано
Разбиение по типам контента превращает sitemap из формальности в диагностический инструмент.

Как получить файл: плагин CMS, краулер, скрипт, динамическая генерация

Плагин или штатный модуль CMS

Самый быстрый путь. Популярные движки умеют собирать карту либо из коробки, либо через SEO-плагин. Минус один, но существенный: по умолчанию в файл попадает всё подряд — теги, архивы по датам, страницы авторов, вложения. Настройка исключений — обязательный шаг, а не опция. После установки плагина откройте получившийся файл глазами и вычеркните всё, что не должно быть отдельной страницей в поиске.

Генератор-краулер

Программа или онлайн-сервис обходит сайт как робот и выгружает статический файл. Плюс: краулер видит реальную доступность страниц и не включит то, до чего сам не дошёл. Минусы: это снимок на момент обхода, который устаревает; краулер не найдёт страницы-сироты (а именно ради них карта часто и делается); на больших сайтах обход занимает часы. Разумная зона применения — сайты до нескольких десятков тысяч URL с редкими изменениями.

Генерация при сборке

Для статических генераторов и SSG-фреймворков карта собирается на этапе билда из того же источника, что и сами страницы. Список URL по определению совпадает с тем, что реально задеплоено. Идеальный вариант для документации, блогов и контентных проектов.

Динамическая генерация из базы

Для крупного сайта альтернатив нет. Только генерация из БД гарантирует, что карта отражает текущее состояние: товар снят с публикации — исчез из файла в ближайший цикл. Ключевой нюанс — не отдавать карту «на лету» на каждый запрос: выборка на 200 000 строк с последующей сборкой XML это тяжёлый запрос, а запрашивают карту не только роботы. Правильно — собирать в файлы по расписанию и отдавать их статикой.

<?php
// build-sitemap.php — запуск по расписанию, результат кладётся статикой
$base = 'https://example.com';
$dir  = '/var/www/example.com/public';
$max  = 45000;                 // запас до лимита 50 000
$part = 1;
$n    = 0;

$sql = "SELECT slug, updated_at
          FROM products
         WHERE is_published = 1
           AND is_indexable = 1
           AND canonical_id IS NULL
      ORDER BY id";

$open = function (int $p) use ($dir) {
    $f = fopen("$dir/sitemap-products-$p.xml", 'w');
    fwrite($f, '<?xml version="1.0" encoding="UTF-8"?>' . "\n");
    fwrite($f, '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n");
    return $f;
};

$out = $open($part);
foreach ($pdo->query($sql, PDO::FETCH_ASSOC) as $row) {
    if ($n >= $max) {                       // закрыли шард, открыли следующий
        fwrite($out, "</urlset>\n");
        fclose($out);
        $out = $open(++$part);
        $n = 0;
    }
    $path = '/product/' . rawurlencode($row['slug']);
    $loc  = htmlspecialchars($base . $path, ENT_XML1 | ENT_QUOTES, 'UTF-8');
    $mod  = date('Y-m-d', strtotime($row['updated_at']));   // дата контента, не времени сборки
    fwrite($out, "  <url><loc>$loc</loc><lastmod>$mod</lastmod></url>\n");
    $n++;
}
fwrite($out, "</urlset>\n");
fclose($out);

Три вещи, которые здесь важнее самого кода: выборка фильтрует по признакам «опубликован», «индексируем» и «канонический»; путь прогоняется через rawurlencode, а итоговый URL — через XML-экранирование; lastmod берётся из поля контента, а не из time().

Как объявить sitemap: robots.txt, панели вебмастеров, IndexNow

Строка Sitemap в robots.txt

Самый универсальный способ: любой краулер, поддерживающий протокол, увидит карту без всякой регистрации.

User-agent: *
Disallow: /cart/
Disallow: /checkout/
Disallow: /search

Sitemap: https://example.com/sitemap.xml
Sitemap: https://example.com/sitemap-news.xml

Правила директивы: адрес обязательно абсолютный; строка не принадлежит ни одной группе User-agent и действует глобально, поэтому её принято выносить в конец файла; строк может быть несколько — например, отдельно основной индекс и отдельно новостная карта. Регистр названия директивы значения не имеет. Подробный разбор синтаксиса и приоритетов — в гайде по robots.txt.

Панели вебмастеров

В Google Search Console карта добавляется в разделе Sitemaps подтверждённого ресурса — отправлять нужно индексный файл, вложенные подхватятся сами. В Яндекс.Вебмастере — раздел «Индексирование → Файлы Sitemap»; по документации на обработку добавленного файла может уйти до двух недель, так что паниковать на третий день не нужно.

Плюс панелей не в самой отправке (robots.txt делает то же самое), а в отчётности: статус обработки, дата последнего чтения, число найденных URL, список ошибок с конкретными строками.

Пинг и IndexNow

Здесь важное обновление, о котором многие руководства до сих пор молчат. Классические ping-эндпоинты, которыми годами «пинали» поисковики после публикации, свою роль потеряли: Google убрал упоминание такого эндпоинта из документации, Bing тоже отказался от него в пользу другого механизма. Ориентироваться на «пингануть после деплоя» больше нет смысла.

Актуальный быстрый сигнал — протокол IndexNow: вы кладёте на сайт ключевой файл и отправляете HTTP-запрос со списком изменившихся адресов. Его поддерживают Bing, Яндекс и ещё несколько поисковиков; Google в протоколе не участвует. Логика такая: sitemap — базовый и обязательный канал для всех, IndexNow — дополнительный быстрый сигнал для тех, кто его принимает. Одно не заменяет другое.

Как часто пересобирать файл

По факту изменений, а не по календарю. Контентный сайт — раз в сутки ночью. Магазин со стабильным ассортиментом — раз в сутки, товарный шард чаще при массовых загрузках. Новостной сайт — новостную карту на каждую публикацию. Статический сайт-визитка — при деплое. Если ничего не менялось, пересобирать файл не нужно: это только собьёт lastmod.

Проверка sitemap: curl, xmllint и выборочная проверка кодов ответа URL
Проверка карты сайта — это три шага: заголовки ответа, валидность XML и коды ответа выборки URL.

Как проверить sitemap

Заголовки ответа и валидность XML

Первое, что нужно увидеть, — что файл вообще отдаётся напрямую, с кодом 200 и правильным типом содержимого. Корректный Content-Typeapplication/xml или text/xml. Если вы видите text/html, это почти всегда значит, что запрос перехватил роутер CMS или SPA и отдал HTML-шаблон вместо файла.

# 1. Заголовки: код ответа, тип содержимого, сжатие
curl -sI https://example.com/sitemap.xml \
  | grep -iE 'HTTP/|content-type|content-encoding|content-length|x-robots-tag'

# 2. Валидность XML (тишина в выводе = ошибок нет)
curl -s https://example.com/sitemap.xml | xmllint --noout -

# 3. Для сжатой карты
curl -s https://example.com/sitemap-products-1.xml.gz | gunzip | xmllint --noout -

# 4. Проверка по официальной XSD-схеме протокола
curl -sO https://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd
curl -s https://example.com/sitemap.xml -o sitemap.xml
xmllint --noout --schema sitemap.xsd sitemap.xml

# 5. BOM в начале файла — частая причина «ошибки синтаксического анализа»
curl -s https://example.com/sitemap.xml | head -c 3 | xxd
# efbb bf в выводе = BOM присутствует, его нужно убрать

Выборочная проверка кодов ответа

Валидный XML ещё ничего не говорит о том, живы ли перечисленные страницы. Разумный компромисс между «проверить всё» и «не проверять ничего» — случайная выборка из полусотни адресов. Если в ней окажется хотя бы один редирект или 404, проблема почти наверняка массовая.

# Коды ответа для 50 случайных URL из карты, 8 запросов параллельно
curl -s https://example.com/sitemap.xml \
  | grep -oE '<loc>[^<]+</loc>' \
  | sed -E 's#</?loc>##g' \
  | shuf -n 50 \
  | xargs -P 8 -I{} curl -s -o /dev/null -w '%{http_code} %{url_effective}\n' {} \
  | sort | uniq -c | sort -rn

# Сколько всего URL в карте и нет ли http-адресов на https-сайте
curl -s https://example.com/sitemap.xml | grep -c '<loc>'
curl -s https://example.com/sitemap.xml | grep -c '<loc>http://'

Ожидаемый результат первой команды — одна строка вида 50 200 …. Любые 301, 302, 404 и 5xx в выводе означают, что генератор карты не синхронизирован с реальным состоянием сайта. Расшифровка кодов — в справочнике по HTTP-статусам.

Отчёты панелей вебмастеров

Смотрите три числа по каждому файлу: обнаружено URL, проиндексировано, ошибки. Разрыв между первыми двумя — это ваш реальный показатель качества контента и технической доступности. Категории «обнаружено, сейчас не проиндексировано» и «просканировано, сейчас не проиндексировано» означают разные вещи: в первом случае робот до страницы не дошёл, во втором — дошёл и решил не брать.

Инструменты enterno.io

  • SEO-аудит — проверяет наличие и доступность карты сайта, находит конфликты между sitemap, robots.txt и мета-директивами.
  • Проверка robots.txt — есть ли директива Sitemap, абсолютный ли адрес, не закрыты ли перечисленные в карте разделы.
  • Поиск битых ссылок — быстрый способ найти 404 среди URL, которые вы объявили поисковикам.
  • Проверка редиректов — прогон адресов из карты на предмет лишних хопов и цепочек.
  • Анализ HTTP-заголовковContent-Type, Content-Encoding и X-Robots-Tag у самого файла карты.

Типовые ошибки: симптом, причина, проверка, фикс

СимптомПричинаКак проверитьФикс
«Не удалось получить файл Sitemap» в панелиФайл отдаёт 404, редирект или закрыт базовой авторизациейcurl -sI по адресу картыОтдавать 200 напрямую, снять авторизацию с пути карты
«Ошибка синтаксического анализа»BOM или пробел перед XML-декларацией, неэкранированный &, обрезанный файлhead -c 3 | xxd, затем xmllint --nooutУбрать BOM, экранировать спецсимволы, проверить, что генерация доходит до конца
Карта открывается как страница сайтаЗапрос перехватывает роутер CMS или SPA, отдаётся Content-Type: text/htmlcurl -sI и просмотр первых строк телаОтдавать статический файл до роутера или явно задать тип содержимого
Отправлено 50 000, проиндексировано 1 200В карте мусор: дубли, фильтры, служебные и тонкие страницыВыборка кодов ответа + сверка с rel="canonical"Чистить список до канонических страниц, разбить по типам и мерить отдельно
«URL в Sitemap заблокирован в robots.txt»Конфликт директив: адрес объявлен и одновременно закрыт от обходаПроверка robots.txtРешить, что правда: убрать URL из карты либо открыть раздел для обхода
http-адреса в карте на https-сайтеЗахардкоженный базовый адрес в конфиге или в настройках CMSgrep -c '<loc>http://' по файлуИсправить базовый URL и пересобрать все шарды
Карта лежит в подпапке, но покрывает весь сайтОграничение протокола по каталогуСверить путь файла с путями в <loc>Перенести файл в корень либо объявить строкой Sitemap: в robots.txt
У всех URL lastmod = сегодняГенератор подставляет время сборки файлаОткрыть файл и посмотреть разброс датБрать дату из поля изменения контента; если её нет — не выводить тег
В карте адреса, удалённые год назадСтатический файл, который никто не пересобираетВыборочная проверка кодов ответаПеревести генерацию на расписание или на сборку проекта
Кириллические адреса «как есть»Генератор не кодирует путьПроверка по XSD-схемеrawurlencode для пути, затем XML-экранирование итогового URL
Индекс обработан, вложенные файлы — нетИндекс ссылается на другой индекс либо на карты чужого хостаОткрыть корневой элемент вложенных файловРазвернуть в один уровень; несколько индексов объявить отдельными строками в robots.txt
Файл больше 50 МБ или свыше 50 000 URLОтсутствие шардированияgrep -c '<loc>' и размер файлаРазбить на шарды по 20 000–45 000 URL и собрать индекс

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

Нужен ли sitemap.xml маленькому сайту?

Обязательным он не является ни для одного сайта. Для сайта на несколько десятков страниц со сплошной перелинковкой эффект будет близок к нулю: робот и так обойдёт всё. Но карта ничего не стоит, а панель вебмастера получит понятную статистику «отправлено против проиндексировано» — уже ради этого её имеет смысл сделать.

Влияет ли sitemap на позиции в поиске?

Нет. Ни сам файл, ни priority, ни changefreq не участвуют в ранжировании. Карта влияет только на обнаружение и приоритет обхода. Обещания «настроим sitemap и вырастут позиции» — маркетинг, а не механика поиска.

Где должен лежать файл и как его назвать?

Имя произвольное — sitemap.xml просто общепринятое соглашение. Расположение существеннее: по протоколу карта покрывает только свой каталог и вложенные, поэтому корень сайта — единственное место, где вопрос не возникает. Файл в подпапке допустим, но тогда его нужно объявить в robots.txt.

Что делать, если URL больше 50 000?

Разбить на несколько файлов и собрать индексный. Не пытайтесь уложиться, выбрасывая страницы: лимит существует для управляемости, а не для того, чтобы ограничить размер вашего сайта. Разумный размер шарда — 20 000–45 000 URL.

Нужно ли указывать changefreq и priority?

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

Сколько ждать индексации после отправки карты?

Гарантированных сроков не существует. Обработка самого файла обычно занимает от нескольких часов до нескольких дней, у Яндекса документация допускает до двух недель. Индексация конкретных страниц зависит от их качества, авторитета сайта и краулингового бюджета — карта на этот срок влияет слабо.

Можно ли класть в карту страницы с редиректом или noindex?

Технически можно, практически не нужно. Редирект тратит запрос робота впустую, noindex создаёт прямое противоречие сигналов. Изредка редирект добавляют намеренно, чтобы робот быстрее узнал о переезде — но это разовая мера с последующей чисткой, а не постоянное состояние файла.

Нужен ли отдельный sitemap для поддомена?

Да. Поддомен — отдельный хост со своим robots.txt и своей картой. Перечислять его URL в карте основного домена нельзя, если только вы не подтвердили права на оба хоста в панели вебмастера.

Чеклист

  • Файл открывается по прямому адресу, отдаёт 200 и Content-Type: application/xml.
  • Кодировка UTF-8, BOM отсутствует, перед XML-декларацией нет пробелов и пустых строк.
  • Namespace http://www.sitemaps.org/schemas/sitemap/0.9 на месте и не переписан.
  • Все <loc> — абсолютные URL той же схемы и того же хоста, что и сам файл.
  • Амперсанды и прочие спецсимволы экранированы, не-ASCII пути приведены к percent-encoding.
  • В карте только канонические, индексируемые URL, отдающие 200.
  • Нет пересечений с Disallow в robots.txt и со страницами под noindex.
  • Ни один файл не превышает 50 000 URL и 50 МБ в несжатом виде.
  • Индексный файл ссылается только на обычные карты того же хоста, без вложенных индексов.
  • lastmod отражает реальное изменение контента, а не время сборки файла.
  • Карта разбита по типам контента, чтобы отчёт вебмастера показывал проблемные разделы.
  • В robots.txt есть строка Sitemap: с абсолютным адресом.
  • Файл добавлен в Google Search Console и Яндекс.Вебмастер, статус обработки проверен.
  • Генерация автоматизирована: расписание или сборка проекта, а не ручная правка.
  • Выборка из 50 случайных URL периодически проверяется на коды ответа.

Проверьте ваш сайт прямо сейчас

Проверить SEO своего сайта →
Другие статьи: SEO
SEO
Open Graph: как настроить превью ссылки в Telegram, VK и соцсетях
21.07.2026 · 476 просм.
SEO
SEO-аудит сайта: чеклист из 20 пунктов
14.03.2026 · 223 просм.
SEO
Цепочки редиректов: как они влияют на SEO и скорость
11.03.2026 · 205 просм.
SEO
Почему сайта нет в поиске: проверяем индексацию и возвращаем страницы в выдачу
21.07.2026 · 194 просм.