Перейти к содержимому
Эльдар Шахвалиев
Обсудить проект
← Все проекты
202604.2026 — 04.2026Сдандоработка существующегодостоверность: medium

homidomi.ru — техническое SEO интернет-магазина на 1С-Битрикс

Интернет-магазин товаров для дома / климат- и BBQ-оборудования (1С-Битрикс) · E-commerce (товары для дома, кондиционирование, грили/BBQ, печи для пиццы)

Backend/Bitrix-разработчик (техническое SEO)

Магазин делил вес между дублями страниц, а указание для поисковика вело на служебный файл движка. Нашёл причину и починил, не трогая ядро и тему.

  • PHP
  • Bitrix
  • Bitrix D7
  • Aspro Lite
  • MySQL
  • Nginx
  • php-fpm 8.3
  • SEO

Ссылки и доступ — по запросу.

2 / 2
задачи ТЗ выполнены (301-редиректы + canonical)
5
файлов изменено/создано, всё в /local/ (ядро и тема не затронуты)
3 → 1
дублей тега canonical на странице приведено к одному
2
раунд доработок по замечаниям заказчика (v2): HTTPS-редирект + canonical на поддоменах
  • Указание на главную версию страницы стояло трижды — при дублях поисковик игнорирует их все. Осталось одно, и ведёт оно на саму страницу.
  • Настроил переадресацию с адресов-дублей на основные, исключив обмен с 1С, приём заказов и админку: ошибка здесь остановила бы работу магазина.
  • Проверил собственный план по документации движка и руководствам поисковых систем до выката — и нашёл в нём ошибки, которые сломали бы часть магазина.
  • Все правки положил в отдельную папку для доработок: обновления движка и темы их не перезапишут.
  • Отработал раунд правок по замечаниям заказчика: региональные поддомены получили собственные указания вместо общего для всего сайта.

Задача

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

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

Что сделано

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

Итог

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

Технические детали

Решение и подход

  • Редиректы только на PHP-уровне. Сайт обслуживается nginx→php-fpm напрямую, поэтому .htaccess/RewriteRule не работают. Редиректы размещены в начале init.php и используют штатный LocalRedirect() (а не header()+exit), что корректно завершает жизненный цикл Битрикс (закрытие БД/сессий, события). Исключения: /bitrix/, /rest/, /upload/, /local/tools/, CLI, cron-агенты (BX_CRONTAB/CHK_EVENT), AJAX, не-GET — чтобы не сломать обмен с 1С и формы магазина.
  • Корневая причина canonical. Старый код брал $_SERVER['DOCUMENT_URI'], который в данной конфигурации nginx после internal rewrite указывает на скрипт-обработчик /bitrix/urlrewrite.php. Замена на D7 HttpRequest::getRequestedPage() (из оригинального REQUEST_URI) и переход с Asset::addString() на штатный $APPLICATION->SetPageProperty('canonical',.).
  • Дедупликация поверх вендора. Тема Aspro (CLiteEvents, OnEndBufferContent, sort=100) переносит canonical в <head> после каждого вхождения <head> и подменяет домен на $_SERVER['SERVER_NAME']. Добавлен собственный обработчик OnEndBufferContent с sort=500, который оставляет один тег и восстанавливает домен из HTTP_HOST (важно для поддоменов вроде rostov.homidomi.ru, т.к. server_name homidomi.ru *.homidomi.ru всегда отдаёт основной домен в SERVER_NAME).
  • Без правок вендора. Все изменения только в /local/; ядро Битрикс, тема Aspro и модуль SmartSEO не модифицировались — устойчивость к обновлениям.

Стек и обоснование

Платформа и границы правок. PHP 8.3 + 1С-Битрикс (D7 API); всё написанное лежит в /local/ по гайдлайнам вендора — ядро и тема остаются обновляемыми, а значит проект не превращается в форк, который нельзя апдейтить.

Aspro Lite 2.3.3 — установленная тема, чьё поведение (CLiteEvents) пришлось учитывать и перекрывать по приоритету обработчика, а не правкой вендорских файлов.

nginx + php-fpm без Apache — конфигурация хостинга (ISPManager). Именно она исключила .htaccess из инструментария и заставила делать редиректы на уровне PHP, а также стала причиной искажения DOCUMENT_URI.

Руководства Google и Yandex по канонизации — основание для решений о том, какой URL считать главным на пагинации и поддоменах; выбор сверялся с документацией, а не с общим ощущением.

Инженерные вызовы

  • Конфигурация nginx→php-fpm, ломающая привычные механики (.htaccess неактивен; DOCUMENT_URI искажён после rewrite) — потребовала переноса логики в init.php и перехода на REQUEST_URI/D7 API.
  • Перекрытие поведения вендорской темы без правки её файлов: собственный OnEndBufferContent с более высоким приоритетом, чтобы починить дубли и домен после CLiteEvents.
  • Мультидоменность (региональные поддомены *.homidomi.ru) и SERVER_NAME, всегда отдающий основной домен, — решено восстановлением домена из HTTP_HOST.
  • Безопасность редиректов для e-commerce: аккуратный whitelist исключений, чтобы не задеть обмен с 1С, REST, AJAX, cron и POST-формы.
  • доработка существующего
  • аудит
  • SEO
  • деплой
  • консультация