Разбираемся с sitemap.xml, а заодно и с поиском

Пишу статью для начинающих, чтобы было проще разобраться с такой типовой задачей.

Не очень в битриксе хорошо дело обстоит с SEO. Да, в последнее время в этом направлении есть определенные подвижки, но этого явно недостаточно. На днях пришлось столкнуться с задачей настройки сайтпама (наконец-то!). Никогда не верьте Битриксоидам насчет того, что «все включается одной галочкой». Сегодня расскажу о том, как более-менее правильно использовать штатный механизм генерации Google Sitemap, тот самый «старый», который принадлежит модулю поиска.

Что такое Google Sitemap рассказывать не буду, информации в интернетах — масса. Идея работы генератора sitemap в битрикс основывается на том, что в поисковом индексе битрикса присутствуют именно все те адреса, которые должны быть доступны поисковикам. Все тупо до невозможности — битрикс берет все адреса из поискового индекса, и пихает их в sitemap.

В принципе оно в чем-то логично. Поэтому наша задача сводится к тому, чтобы оптимизировать поисковый индекс на сайте.

Оптимизируем индекс

Инфоблоки

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

Вот и яркий пример — кто-то создал инфоблок, который будет хранить запросы на обратный звонок. При этом оставил заполненными по-умолчанию поля с шаблонами URL адресов сущностей, а также галочки «Индексировать разделы» и «Индексировать элементы» для модуля поиска. Запомните — если сущность не имеет адреса и вы не хотите использовать ее для отображения в публичной части сайта, нужно убирать эти настройки, иначе записи будут попадать в поисковый индекс, а значит и в sitemap попадут, чего нам в данном случае не нужно.
Старайтесь вообще использовать инфоблоки для хранения только тех сущностей, которые будут иметь URL на сайте. Для всех других типов данных можно использовать HL-блоки или свои таблицы в БД, к которым можно прицепить ORM.

Главный модуль и управление структурой

Если с инфоблоками все просто, то тут придется немного повозиться. Нужно понимать, что при индексации файлов битрикс рекурсивно пробегает по всем доступным для чтения директориям и проверяет права на доступ к файлам. Поэтому надо сначала удалить все лишние файлы (а их бывает часто много), после чего закрыть доступ к тем файлам, которые не должны быть доступны через поиск.

При этом могут появиться следующие проблемы:

  1. Индексируются файлы *index.php.
  2. Индексируются файлы с подключением не комплесных компонентов.

Проблема 2 решается просто. Поскольку таких страниц на сайте, как правило, не много, то достаточно закрыть такие страницы от индексации средствами модуля поиска. Для этого идем в Настройки — Настройки продукта — Настройки модулей — Поиск, и в опции «Маска исключения» вбиваем нужный адрес скрипта. Например, если интересующий нас скрипт — /news/detail.php, то добавляем его туда именно в таком виде (без хоста).

denyurl

Для решения первой проблемы потребуется написать немного кода. Я решил ее следующим способом. В модуле поиска есть обработчик событий BeforeIndex. Он вызывается непосредственно перед тем, как добавить запись в поисковый индекс. Нам нужно просто проверить URL, который модуль будет пытаться добавить в индекс и убрать от туда index.php:

Очевидно, что осталось зарегистрировать данный обработчик и тогда при переиндексации элементов из их адреса будет удаляться index.php, если URL элемента на него заканчивался. Хочу заметить, что применяем мы это только для главного модуля, т.к. именно он генерирует такие адреса.
Также от данной проблемы можно избавиться, установив константу BX_DISABLE_INDEX_PAGE в значение true, однако в поисковом индексе все равно будут храниться адреса с index.php.
Едем дальше ..

Форум

Этот модуль строит адреса на основании шаблонов, которые задаются для каждой темы.

forum-settings

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

Блоги

В общем-то не часто приходится работать с этим модулем. Но судя по всему управление адресами производится из настроек самого модуля: Настройки — Настройки продукта — Настройки модулей — Блоги — Вкладка «Шаблоны путей». Этот модуль — ровесник динозаврам и мне кажется настолько редко используется, что даже рассматривать его не буду.

Другие проблемы

В настройках модуля поиска есть настройка «Маска исключения», я писал о ней выше. Так вот учтите, что при переиндексации эти исключения будут учтены только для главного модуля. Т.е. если у вас есть адреса для каких-то разделов каталога вида /catalog/bytovaya-technika/stiralki/ и вы хотите его исключить, не исключая его из выдачи на сайте, то не получится. Но можно легко допилить, опять же в пару строк. Доработаем наш обработчик события, добавим в начало (для php 5.4+):

Метод CheckPath проверяет строку на соответствие маске исключения и возвращает false в случае несоответствия. Тут небольшая хитрость — чтобы пропустить индексацию какого-либо элемента, то надо задать для него пустые TITLE и BODY. В этом случае модуль поиска поймет, что нужно данный элемент пропустить. Что забавно — если вернуть из обработчика что-то отличное от данного массива, то элемент все равно будет проиндексирован. Битрикс такой битрикс …

Генерируем sitemap

Перед тем как приступать к генерации sitemap, надо переиндексировать сайт. Сделать это можно в меню Настройки — Поиск — Переиндексация.
После этого идем в Настройки — Поиск — Google Sitemap, указываем требуемые настройки и создаем sitemap. Интересно, почему именно в настройки sitemap вынесена возможность исключить из карты сайта сообщения форума?

Все — в корне сайта должно появиться 3 файла (минимум, зависит от количества ссылок) — sitemap_index.xml, sitemap_errors.xml и sitemap_xxx.xml (где xxx порядковый номер файла).
Осталось указать в robots.txt соответствующую директиву.

Автообновление

Сами по себе файлы сайтмапа обновляться не будут, поэтому надо зарегистрировать агент, который будет это делать периодически.

Можно поставить запуск этого агента раз в несколько суток. В этом случае сайтмап будет поддерживаться в актуальном состоянии.

Прочее

Штатный механизм поиска не добавит вам в sitemap дополнительные поля с частотой обновления документов и приоритетом документов. Чтобы его добавить — имеет смысл отказаться от штатного механизма, или расширить его возможности каким-то образом.

При решении проблем с сайтмапом старайтесь сначала решить проблему через модуль поиска, убрав/добавив нужные адреса в поисковый индекс. Подкорректировать URL можно с помощью обработчика OnSearchGetUrl, но это уже крайний случай — лучше держать в поисковом индексе корректно сформированный адрес.

с 14й версии в битриксе существует новый механизм генерации sitemap, но я рассмотрю его как-нибудь в следующий раз. Пока не рекомендую его использовать, т.к. он пока очень многого не умеет, глючит, да и позиция разработчиков по функционалу этого модуля весьма странная.

Если у вас есть какой-то свой модуль, который использует собственные сущности, публично показываемые на сайте, то их тоже нужно будет добавить в поисковый индекс, чтобы оттуда они попали в sitemap.