Добавляем тег rel=canonical на страницы сайта Битрикс
Задача:
Добавить на сайте тег rel="canonical", чтобы убрать дубли в Каталоге и Информационных страницах.
- Для детальной страниц каталога будем использовать типовой функционал 1С-Битрикс через настройки компонента и инфоблока.
- Для всех остальных случаев, будем использовать свой код.
Шаг 1. Выводим тег canonical на детальной странице товара
На сайте, на котором мы выполняли эту задачу были дубли одного и того же товара, хотя сам товар в инфоблоке был привязан физически к одному подразделу. Вот пример дублей одного товара в структуре каталога
- /catalog/instrument/molot/2187/
- /catalog/instrument-dlya-montazha/2187/
- /catalog/ruchnoy_instrument/2187/
Первым делом выполняем простую задачу, т.е. идем в настройки Инфоблока и настройки Компонента и следуем рекомендациям описанным на официальном сайте 1С-Битрикс: https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=34&LESSON_ID=7199.
Далее, в код комплексного компонента добавляем строчку "DETAIL_SET_CANONICAL_URL" => "Y",
Проверяем, что у нас получилось!
Теперь при переходе на страницы указанные в нашем примере в коде сайте отображается постоянный тег, в котором указан правильный путь до этого товара
< link rel=" canonical" href="https://SITE.RU/catalog/instrument-dlya-montazha/zaklyepochniki/2187/" />
Теперь можно переходить к самописному коду для всего сайта, кроме карточки товара.
Шаг 2. Пишем кастомный код для вывода тега canonical для остальных случаев
Что будет делает этот код:
- Формировать базовый URL без порта и с HTTPS.
- Очищать текущий URL от
/index.phpи параметров фильтра, если это необходимо. - Добавлять
/в конец URL, если это не.phpили.html. - Исключать страницы с ID товара из канонического тега и формирует правильный канонический URL для остальных страниц.
Описание кода
- Определяем базовый URL:
$protocol = 'https://'; // Используется HTTPS $host = $_SERVER['HTTP_HOST']; $host = preg_replace('/:\d+$/', '', $host); $baseUrl = $protocol . $host;- Определяем протокол (
https://) и домен сайта ($_SERVER['HTTP_HOST']). - Удаляем порт из домена, если он присутствует (
preg_replace('/:\d+$/', '', $host)). - Формируем базовый URL сайта (
$baseUrl).
- Определяем протокол (
- Получаем текущий URL для канонического тега:
$canonicalUrl = $APPLICATION->GetCurPage(true); $canonicalUrl = preg_replace('/\/index\.php$/', '', $canonicalUrl);- Получаем текущий URL страницы, используя метод
$APPLICATION->GetCurPage(true). - Убираем
/index.phpиз конца URL, если он присутствует.
- Получаем текущий URL страницы, используя метод
- Добавляем обработку страниц смарт фильтра в Каталоге:
if (strpos($canonicalUrl, '/filter/') !== false) { $parentSectionUrl = preg_replace('/\/filter\/.*$/', '', $canonicalUrl); $parentSectionUrl = preg_replace('/\/index\.php$/', '', $parentSectionUrl); $canonicalUrl = $parentSectionUrl; }- Если URL содержит
/filter/, обрабатываем его, чтобы получить URL родительского раздела (без параметров фильтра). - Убираем
/index.phpиз родительского URL, если он присутствует.
- Если URL содержит
- Добавляем / в конец URL:
if (!preg_match('/\.(php|html)$/', $canonicalUrl)) { $canonicalUrl = rtrim($canonicalUrl, '/') . '/'; }- Проверяем, что URL заканчивается на
/, если он не заканчивается на.phpили.html.
- Проверяем, что URL заканчивается на
- Добавляем проверка на детальную страницу товара и вывод канонического тега:
if (!preg_match('/\/\d+\/$/', $canonicalUrl)) { $canonicalFullUrl = $baseUrl . $canonicalUrl; if ($baseUrl . $_SERVER['REQUEST_URI'] !== $canonicalFullUrl) { echo ''; } }- Проверяем, является ли текущая страница детальной страницей товара по наличию ID товара в URL (
preg_match('/\/\d+\/$/', $canonicalUrl)). - Формируем полный канонический URL и добавляем его в
<link rel="canonical">, если он отличается от текущего URL страницы.
- Проверяем, является ли текущая страница детальной страницей товара по наличию ID товара в URL (
- Проверяем, является ли текущая страница детальной страницей товара по наличию ID товара в URL (
preg_match('/\/\d+\/$/', $canonicalUrl)). - Формируем полный канонический URL и добавляем его в
<link rel="canonical">, если он отличается от текущего URL страницы.
Настройка товаров с каноническими ссылками
Если вы размещаете одну и ту же информацию о товаре на нескольких страницах, поисковики реагируют на это негативно и понижают позиции сайта в выдаче. Исправить ситуацию помогут канонические ссылки. Поисковики будут ранжировать ту страницу, которая отмечена как основная, а дубликаты отметят как малозначительные.Каноническая ссылка – это ссылка, записанная со специальным атрибутом rel = “canonical” в исходном коде страницы. Именно она укажет роботу, что просматриваемая страница является основной.
В данной статье мы разберем, как установить канонические ссылки для страниц с описанием того, что вы продаете (для элементов каталога товаров, курсов, программных продуктов и т.д.).
Перейдите в административной части сайта в Контент → Инфоблоки → Типы инфоблоков → Каталог. Выберите инфоблок, в котором хранится информация о распространяемой вами продукции или предлагаемых тарифах. Например, чтобы настроить канонические ссылки для детального описания предлагаемого на сайте ПО, следует выбрать инфоблок «Продукты».

Далее откройте вкладку «Поля» (1) и установите галку возле пункта «Разрешить выбор основного раздела для привязки» (2).

Нажмите кнопку «Применить» (3) и вернитесь на вкладку «Инфоблок». Здесь нужно указать канонический URL элемента (протокол, адрес сервера и путь на сайте).
В решении Аспро: Next строка должна иметь вид:
http://#SERVER_NAME##SITE_DIR#catalog/#SECTION_CODE_PATH#/#ELEMENT_ID#/.
Если вы используете протокол https, обязательно укажите это – замените на него «http» в начале строки.

В остальных решениях (для интернет-магазинов и корпоративных сайтов) URL нужно указать явно. Например, для сайта на основе решения Аспро: Digital поле следует заполнять так:
https://yoursite.ru/catalog/#SECTION_CODE_PATH#/#ELEMENT_CODE#/,
где yoursite.ru – адрес вашего сайта.

После сохранения всех изменений необходимо указать основной раздел для элементов каталога. Для этого нужно отредактировать одну карточку товара (для остальных элементов основной раздел проставится автоматически).
Перейдите в каталог предлагаемой вами продукции (Рабочий стол → Контент → Каталог → Каталог товаров) и откройте любую карточку. В редакторе появится новое поле «Основной раздел». Заполните его и сохраните изменения.

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

В верхних списках выделите «Товар» или «Элемент» (в зависимости от используемого решения) (1, 2), в нижнем левом списке – «Основной раздел» (3). Переместите выделенное поле в соседний список при помощи кнопки со стрелкой (4) и нажмите «Сохранить» (5).

Последний шаг – настройка параметров компонента. Откройте в публичной части сайта любую карточку товара. Активируйте режим правки. Наведите указатель на описание предложения и нажмите на шестеренку в появившемся меню.

В новом окне перейдите к группе параметров «Настройки детального просмотра», поставьте галку возле «Устанавливать канонический URL» и сохраните настройки.

После этого на каждой странице описания товара в исходном коде появится нужная запись.
