Налаштування канонічних URL для Bitrix CMS
Дублікований контент — одна з частих SEO-проблем у Bitrix. Один і той же товар доступний за кількома URL: через розділи каталогу, через пошук, з GET-параметрами фільтра, з параметрами сеансу. Без тегу <link rel="canonical"> пошукова система сама визначає, який URL вважати основним — не завжди правильно.
Де у Bitrix виникають дублі URL
- Товар доступний з кількох розділів каталогу (інфоблок з множинною прив'язкою до розділів)
- Сторінка з GET-параметрами:
/catalog/?sort=price&order=ascта/catalog/ - Сторінка розумного фільтра без SEF:
/catalog/?arrFilter_P1=100&set_filter=Y - HTTP та HTTPS версії
- З
wwwта без
Canonical через компонент
У стандартних компонентах Bitrix (bitrix:catalog.element, bitrix:catalog.section) немає вбудованого виведення canonical-тегу. Його потрібно додавати у шаблон компонента.
У шаблоні template.php карточки товару:
// Отримати канонічну URL елемента
$canonicalUrl = $APPLICATION->GetCurDir() . CIBlockElement::GetDetailPageUrl(
$arResult['IBLOCK']['DETAIL_PAGE_URL'],
$arResult
);
// Вивести у HEAD через AddHeadString
$APPLICATION->AddHeadString(
'<link rel="canonical" href="https://site.ru' . htmlspecialchars($canonicalUrl) . '" />',
true
);
Canonical для сторінок з фільтром
Сторінки розумного фільтра з непустими параметрами повинні мати canonical на базову сторінку розділу або на SEF-URL фільтра (якщо використовується ЧПУ для фільтра).
У шаблоні компонента розумного фільтра або розділу:
$isFiltered = !empty($_REQUEST['set_filter']) || !empty($_REQUEST['arrFilter_P1']);
if ($isFiltered) {
$canonicalUrl = $APPLICATION->GetCurPage(); // тільки шлях без GET-параметрів
$APPLICATION->AddHeadString('<link rel="canonical" href="https://site.ru' . $canonicalUrl . '" />');
}
Canonical для пагінації
Сторінки /catalog/?PAGEN_1=2 — спірний момент. Варіанти:
- Canonical на першу сторінку (агресивно, втрачається вага посилання)
- Не ставити canonical, але використовувати
rel="prev"/rel="next"(застарілий підхід, Google не враховує) - Унікальний canonical для кожної сторінки пагінації (рекомендується при унікальному контенті на кожній сторінці)
Глобальне налаштування canonical через init.php
Для централізованої установки canonical без змінення кожного шаблону:
// /local/php_interface/init.php
AddEventHandler('main', 'OnEndBufferContent', function(&$content) {
global $APPLICATION;
$canonical = 'https://site.ru' . $APPLICATION->GetCurPage();
$tag = '<link rel="canonical" href="' . htmlspecialchars($canonical) . '" />';
$content = str_replace('</head>', $tag . '</head>', $content);
});
Підхід грубий — підходить для простих сайтів. Для каталогів з фільтрами потрібна логіка виключень.
Терміни виконання
Налаштування canonical для карточок товарів та розділів каталогу — 2–4 години. Повна реалізація з обробкою сторінок фільтра, пагінації та користувацьких URL — 4–8 годин.







