Поиск и устранение SEO-клоакинга в 1С-Битрикс
На сайте на базе 1С-Битрикс была обнаружена проблема: поисковый робот Яндекса
получал другой title, description и Open Graph-метаданные,
чем обычный посетитель. При этом стандартные проверки по User-Agent, кэшированию,
геолокации и SEF-роутингу не давали никаких результатов.
Особенно показательно было то, что проблема воспроизводилась только при обращении
с реальных IP-адресов Яндекса. Подмена User-Agent через curl не помогала,
поскольку сервер продолжал видеть реальный IP клиента. Дополнительная диагностика
показала, что подмена происходила непосредственно внутри PHP-рантайма, ещё до отправки
HTTP-ответа внешнему клиенту.
Что было обнаружено:
- проверка IP-адреса посетителя на принадлежность к диапазонам поисковых роботов;
- отдельная логика для IP-адресов Яндекса и других поисковых систем;
- скрытая функция
isAllowedToSeeHeader() в файле
bitrix/admin/iblock_list_counter.php;
- условное выполнение основной логики формирования страницы в шаблоне
детальной страницы инфоблока;
- отсутствие запроса элемента инфоблока и генерации метаданных для определённых IP.
В результате для обычного пользователя выполнялся код, который получал элемент
инфоблока и формировал его метаданные через CMedc2::AddMeta().
Для запросов с IP-адресов Яндекса эта ветка кода блокировалась, поэтому страница
продолжала использовать значения title и description,
заданные уровнем выше.
Как удалось локализовать проблему:
-
установлен обработчик
OnEndBufferContent для анализа уже
сформированного PHP-ответа;
-
выполнена проверка принадлежности IP к диапазонам Яндекса с дополнительной
верификацией через обратный DNS-запрос;
-
проведена серия запросов с различными User-Agent и HTTP-заголовками;
-
выполнены параллельные запросы для исключения race condition;
-
проверено поведение Composite-кэша и дискового кэша Bitrix;
-
исключены A/B-тесты, геолокация, мультисайтовость и проблемы SEF-роутинга;
-
результат дополнительно подтверждён через инструмент проверки ответа сервера
в Яндекс.Вебмастере.
Причина:
В шаблоне детальной страницы использовалась проверка isAllowedToSeeHeader(),
которая фактически определяла, будет ли выполнена основная логика формирования
контента и метаданных страницы.
Сама функция находилась в нетипичном для подобной логики месте —
bitrix/admin/iblock_list_counter.php — и проверяла
REMOTE_ADDR на соответствие заранее заданным диапазонам IP
поисковых роботов.
Временная замена результата функции на true полностью устранила
проблему: для запросов Яндекса начали формироваться те же данные, что и для
обычного пользователя. Это подтвердило причинно-следственную связь между
IP-фильтром и подменой SEO-метаданных.
Почему это было похоже на SEO-клоакинг:
- разный контент для поискового робота и обычного посетителя;
- определение робота по IP, а не по User-Agent;
- скрытая логика в файле, не связанном с SEO или шаблоном страницы;
- изменение поведения только для определённых поисковых сетей;
- синхронное изменение нескольких файлов шаблона.
При этом само по себе обнаружение подобной логики ещё не доказывает конкретный
способ её внедрения. Для установления источника изменения дополнительно требуется
анализ истории файлов, резервных копий, журналов доступа к административной части,
FTP/SSH-доступа и прав на запись PHP-файлов.
Исправление:
- удалена посторонняя проверка
isAllowedToSeeHeader() из шаблона;
- удалены диагностические маркеры, использовавшиеся во время расследования;
- проведён поиск аналогичной логики по всему проекту;
- проверены упоминания
isAllowedToSeeHeader,
ipInCidr, blocked_ranges и связанных IP-диапазонов;
- повторно проверена генерация страниц для обычного пользователя и Яндекс-бота;
- результат дополнительно проверен через Яндекс.Вебмастер.
В результате поисковый робот Яндекса снова получает тот же контент и SEO-метаданные,
что и обычный посетитель. Проблема была локализована на уровне PHP-кода, без
необходимости изменять конфигурацию nginx, Apache или внешнего edge-слоя.
PHP
1C-Bitrix
MySQL
nginx
Apache
SEO
YandexBot
Web Debugging