Файл sitemap.xml используется поисковыми системами для индексации страниц сайта. В стандартной установке 1С-Битрикс автоматическая генерация sitemap возможна через модуль SEO, но он не всегда доступен, особенно в редакциях без поддержки соответствующего функционала. В таких случаях имеет смысл создать sitemap вручную с помощью PHP-скрипта.
Битрикс хранит данные о страницах в различных источниках: инфоблоки, символьные ссылки, пользовательские компоненты. Это означает, что универсальное решение должно учитывать структуру сайта и логику построения URL. Для этого потребуется обращаться к API Bitrix: CIBlockElement::GetList, CIBlockSection::GetList, а также использовать методы для генерации ЧПУ-ссылок – CIBlock::GetArrayByID и CIBlock::GetFields.
Генерация sitemap без плагинов позволяет контролировать частоту обновления, приоритет страниц, исключение технических URL и добавление пользовательских маршрутов. Это особенно актуально для крупных проектов с нестандартной структурой. Кроме того, вручную созданный скрипт можно запускать по cron и обновлять файл sitemap автоматически с заданной периодичностью.
Результат – компактный, валидный XML-файл, содержащий ссылки только на актуальные и индексируемые страницы. Такой подход снижает нагрузку на сервер, исключает дублирование данных и повышает предсказуемость поведения поисковых роботов.
Создание PHP-скрипта для генерации sitemap.xml в корне сайта
Для генерации sitemap.xml без использования модулей необходимо создать отдельный PHP-скрипт, который будет собирать ссылки на страницы сайта и записывать их в файл. Скрипт должен находиться в корне проекта, например: /sitemap-generator.php.
В скрипте потребуется установить заголовки, собрать список URL, сформировать структуру XML и сохранить её в файл. Пример базовой структуры скрипта:
<?php
$baseUrl = 'https://example.com';
$urls = [];
// Пример добавления статических страниц
$urls[] = '/';
$urls[] = '/about/';
$urls[] = '/contacts/';
// Добавление элементов из инфоблока
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule('iblock');
$res = CIBlockElement::GetList(
['ID' => 'ASC'],
['IBLOCK_ID' => 5, 'ACTIVE' => 'Y'],
false,
false,
['DETAIL_PAGE_URL', 'ID']
);
while ($item = $res->GetNext()) {
$urls[] = CComponentEngine::MakePathFromTemplate($item['DETAIL_PAGE_URL'], ['ELEMENT_ID' => $item['ID']]);
}
$xml = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
$xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
foreach ($urls as $path) {
$xml .= " <url>\n";
$xml .= " <loc>" . htmlspecialchars($baseUrl . $path, ENT_XML1) . "</loc>\n";
$xml .= " </url>\n";
}
$xml .= '</urlset>';
file_put_contents($_SERVER["DOCUMENT_ROOT"].'/sitemap.xml', $xml);
?>
Рекомендации:
- Не используйте абсолютные пути к страницам в массиве $urls. Они должны быть относительными от корня сайта.
- Проверяйте валидность URL перед добавлением. Исключайте дублирующиеся и редиректящиеся страницы.
- Добавьте планировщик (через cron) для регулярного обновления карты сайта, особенно при работе с динамическим контентом.
- Ограничьте количество URL до 50 000 на файл или 50 МБ по требованиям Google. При превышении – разбивайте на несколько файлов с индексной картой.
Поиск и фильтрация страниц для включения в карту сайта
При генерации sitemap без использования модулей необходимо вручную определить, какие страницы должны попасть в файл. В первую очередь отбираются статические страницы и разделы, созданные в рамках публичной части сайта. Их адреса можно получить через обход дерева сайтовых разделов, используя методы CIBlockSection::GetList и CIBlockElement::GetList при работе с инфоблоками.
Для исключения технических, временных и дублирующих страниц стоит заранее определить список критериев фильтрации. Не включаются:
- страницы с параметрами в URL (например, ?print=Y или ?PAGEN_1=2) – такие ссылки создаются динамически и не предназначены для индексации;
- страницы, скрытые по метке noindex или с HTTP-заголовком X-Robots-Tag: noindex;
- элементы инфоблоков с датой начала публикации в будущем или истёкшим сроком активности (ACTIVE_FROM и ACTIVE_TO);
- разделы и элементы с флагом ACTIVE = ‘N’;
- страницы, к которым закрыт доступ для групп пользователей без авторизации.
Особое внимание следует уделить ЧПУ: если сайт использует шаблоны URL с множеством параметров, необходимо вручную собирать базовые адреса без GET-параметров и якорей. Обход должен исключать ссылки на фильтрацию (например, /catalog/?filter…) и сортировку.
Рекомендуется использовать собственный скрипт на базе API Bitrix: при переборе инфоблоков проверять поля DETAIL_PAGE_URL и SECTION_PAGE_URL, заменяя макросы на реальные значения. Также следует учитывать настройки многосайтовости, если структура сайта включает несколько доменов или зеркал.
Формирование финального списка происходит после удаления дублей и приведения URL к абсолютной форме с указанием протокола. Все адреса должны быть доступны без редиректов и ошибок 404.
Учет ЧПУ и мультиязычности при формировании ссылок
При генерации sitemap в Битриксе важно учитывать структуру ЧПУ и языковые версии сайта, чтобы исключить дублирование и ошибки индексации.
- Используйте
CSite::GetList
для получения всех активных сайтов. Это позволяет определить языковые версии и корневые директории для каждого домена. - Определяйте язык каждого сайта по параметру
LANGUAGE_ID
. Используйте его при генерации ссылок: например,/en/catalog/
и/ru/catalog/
должны обрабатываться отдельно. - Формируйте ссылки с учетом префиксов: для мультисайтовой конфигурации ЧПУ ссылки могут отличаться не только по языку, но и по структуре директории.
- Не используйте абсолютные пути типа
/index.php?lang=ru
. Только ЧПУ, полученные черезCHTTP::urnEncode
илиCHTTP::urn2uri
, в зависимости от конфигурации. - При наличии языковых поддоменов учитывайте домен сайта в
SITE_DIR
– он может отличаться даже при одинаковой структуре ЧПУ. - Исключайте дубли. Если один и тот же элемент доступен по разным языковым адресам, но не переводится, добавляйте только одну версию, предпочтительно основную.
Пример кода для определения префикса языка и формирования корректной ссылки:
$rsSites = CSite::GetList($by="sort", $order="asc", ["ACTIVE" => "Y"]);
while ($arSite = $rsSites->Fetch()) {
$langPrefix = rtrim($arSite["DIR"], "/");
$domain = $arSite["SERVER_NAME"];
$url = "https://{$domain}{$langPrefix}/catalog/";
// добавление в sitemap
}
Для многосайтовых решений важно не смешивать ссылки разных языков и доменов в одной карте сайта. Формируйте отдельный файл sitemap для каждого сайта или добавляйте <xhtml:link rel="alternate" hreflang="...">
для мультиязычных ссылок при использовании расширенного формата.
Добавление приоритетов и частоты обновления в XML
В файле sitemap.xml можно задать приоритетность страниц и частоту их обновления с помощью тегов <priority> и <changefreq>. Эти параметры не обязательны, но учитываются поисковыми системами при индексации.
- <priority> – значение от 0.0 до 1.0, определяет относительную важность страницы. Главная – 1.0, разделы – 0.8, карточки товаров – 0.5 и ниже.
- <changefreq> – допустимые значения: always, hourly, daily, weekly, monthly, yearly, never. Для новостных страниц – daily или hourly, для статических – monthly или yearly.
Пример структуры элемента с этими параметрами:
<url>
<loc>https://example.ru/catalog/</loc>
<lastmod>2025-05-16</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
Для генерации значений можно использовать простые правила в PHP. Например, задавать приоритет в зависимости от уровня вложенности URL, а частоту – по дате последнего изменения:
$priority = 1.0;
if (substr_count($url, '/') > 2) {
$priority = 0.5;
}
$changefreq = 'monthly';
$days_since_update = (time() - strtotime($lastmod)) / 86400;
if ($days_since_update <= 1) {
$changefreq = 'daily';
} elseif ($days_since_update <= 7) {
$changefreq = 'weekly';
}
Эти параметры не влияют напрямую на позиции в поиске, но помогают поисковым системам расставлять приоритеты при обходе сайта. Использовать их стоит обдуманно, без автоматического присвоения одинаковых значений всем страницам.
Автоматическое обновление sitemap при изменениях на сайте
Для автоматического обновления sitemap в Битриксе без модулей используется задание агента или cron-скрипт, который отслеживает изменения и перегенерирует файл карты сайта.
Создайте PHP-скрипт, который будет формировать актуальную sitemap.xml. Используйте CIBlockElement::GetList для получения URL-адресов из нужных инфоблоков. Включайте только активные элементы с ненулевым значением ACTIVE = ‘Y’ и ACTIVE_DATE = ‘Y’.
Пример настройки агента:
CAgent::AddAgent(
"GenerateSitemap();",
"main",
"N",
3600
);
Функция GenerateSitemap должна генерировать sitemap.xml и сохранять его в корне сайта. Для этого используйте file_put_contents и CHTTP::urn2path для корректной генерации путей.
Альтернатива – cron-задание:
*/30 * * * * /usr/bin/php /home/bitrix/www/cron/sitemap_generate.php
Скрипт должен включать пролог через require($_SERVER[«DOCUMENT_ROOT»].»/bitrix/modules/main/include/prolog_before.php»); и завершаться exit;.
Для минимизации нагрузки на базу данных исключайте из выборки элементы без публичных страниц, черновики, скрытые разделы. Используйте кэширование результата через CPHPCache, чтобы не генерировать sitemap заново без изменений.
Обязательно обновляйте атрибут <lastmod> для каждой ссылки – используйте поле TIMESTAMP_X из инфоблока, приведённое к формату ISO 8601.
Настройка прав доступа и защита от лишнего сканирования
Для ограничения доступа к sitemap в Битриксе без сторонних модулей стоит использовать стандартные возможности системы. В первую очередь нужно проверить права на чтение файла sitemap.xml в настройках веб-сервера и в настройках инфоблока, если карта генерируется динамически. В .htaccess рекомендуется прописать директивы, запрещающие доступ для нежелательных IP-адресов или ботов. Например, для запрета определённых User-Agent можно добавить:
RewriteCond %{HTTP_USER_AGENT} BadBotName [NC]
RewriteRule .* - [F,L]
Также можно настроить ограничение по IP через .htaccess:
Order deny,allow
Deny from all
Allow from 123.456.789.0
if(!$USER->IsAuthorized() || !$USER->IsAdmin())
die('Доступ запрещён');
Это позволит ограничить доступ к sitemap только определённым группам пользователей. Чтобы минимизировать нагрузку от лишних сканирований, нужно настроить правильные заголовки кеширования и указать в robots.txt, какие разделы сайта не должны индексироваться. Например:
User-agent: *
Disallow: /bitrix/
Disallow: /local/
Использование заголовков HTTP Cache-Control и Expires снижает частоту запросов к sitemap и экономит ресурсы сервера. В итоге сочетание правильных прав доступа, фильтрации User-Agent и настроек кеширования эффективно защищает карту сайта от лишнего сканирования без установки дополнительных плагинов.
Вопрос-ответ:
Как можно создать sitemap в Битриксе без использования дополнительных модулей и плагинов?
Для создания sitemap без сторонних модулей в Битриксе достаточно написать собственный скрипт на PHP, который будет проходить по структуре сайта и формировать XML-файл в нужном формате. Обычно это делается с помощью функций для работы с файловой системой и базой данных, чтобы собрать все ссылки на страницы и оформить их согласно требованиям поисковых систем.
Какие сложности могут возникнуть при самостоятельной генерации sitemap в Битриксе?
Основные трудности связаны с правильной выборкой адресов страниц, особенно если сайт имеет сложную структуру или много динамических разделов. Нужно учесть фильтрацию дублирующихся URL, корректно указать приоритеты и частоту обновления страниц. Также важно убедиться, что полученный XML соответствует стандарту, чтобы поисковики смогли его обработать.
Можно ли автоматизировать обновление sitemap, созданного вручную, и как это сделать?
Да, автоматизация возможна через добавление скрипта генерации в планировщик задач сервера (cron). Таким образом файл sitemap будет регулярно пересоздаваться, учитывая новые или изменённые страницы. Нужно настроить период запуска в зависимости от частоты обновления сайта и при необходимости отправлять уведомления поисковым системам.
Какие преимущества даёт ручное создание sitemap по сравнению с использованием модулей Битрикса?
Ручное создание sitemap позволяет полностью контролировать процесс и структуру файла, не зависеть от ограничений и особенностей сторонних решений. Такой подход подходит, когда нужен специфический формат или фильтрация страниц, а также помогает избежать лишних нагрузок на систему, которые могут возникать при работе некоторых модулей.
Как проверить правильность сформированного sitemap и его соответствие требованиям поисковых систем?
Для проверки можно использовать специальные инструменты поисковых систем, например, Яндекс.Вебмастер или Google Search Console. Там можно загрузить sitemap и просмотреть, как он интерпретируется. Также полезно проверить файл на ошибки с помощью онлайн-валидаторов XML, чтобы убедиться в корректности структуры и кодировки.