Задача:
Добавить на сайте тег rel="canonical"
, чтобы убрать дубли в Каталоге и Информационных страницах.
- Для детальной страниц каталога будем использовать типовой функционал 1С-Битрикс через настройки компонента и инфоблока.
- Для всех остальных случаев, будем использовать свой код.
Шаг 1. Выводим тег canonical на детальной странице товара
На сайте, на котором мы выполняли эту задачу были дубли одного и того же товара, хотя сам товар в инфоблоке был привязан физически к одному подразделу. Вот пример дублей одного товара в структуре каталога
- /catalog/instrument-dlya-montazha/zaklyepochniki/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 страницы.
- Проверяем, является ли текущая страница детальной страницей товара по наличию ID товара в URL (
Этот код поможет корректно формировать канонический URL для вашего сайта, учитывая специфические условия для фильтров и детальных страниц товаров.