1С-Битрикс: как настроить canonical через SetPageProperty и ShowMeta
Пошаговая настройка canonical в 1С-Битрикс через свойства страницы: SetPageProperty, SetDirProperty и ShowMeta с проверкой результата и типичными ошибками.
Запрос, с которым обычно приходят: в индексе появляются дубли страниц, а canonical либо не выводится, либо выводится не там, где ожидается. В 1С-Битрикс это решается штатно через свойства страницы и раздела: SetPageProperty, SetDirProperty, ShowMeta. Ниже только рабочая схема по официальной документации, без кастомной магии.
Официальные источники:
- https://docs.1c-bitrix.ru/pages/cms-basics/page-templates.html
- https://docs.1c-bitrix.ru/api/classes/CAllMain.html#method_SetPageProperty
- https://docs.1c-bitrix.ru/api/classes/CAllMain.html#method_SetDirProperty
- https://docs.1c-bitrix.ru/api/classes/CAllMain.html#method_ShowMeta
- https://docs.1c-bitrix.ru/api/classes/CAllMain.html#method_GetProperty
Типовые симптомы:
- canonical вообще отсутствует в
<head>; - canonical задается, но не на всех страницах раздела;
- в шаблоне есть вывод meta-тегов, но canonical не появляется;
- на разных URL с одинаковым контентом нет единого канонического адреса.
Почему это происходит в Битрикс:
- свойство canonical задано на странице, но в шаблоне не выведено через
ShowMeta; - canonical ожидают из
.section.php, но используютSetPagePropertyвместоSetDirProperty; - свойство называется не так, как параметр в
ShowMeta; - задают свойство поздно и не проверяют итоговый HTML.
Документация по шаблонам страниц прямо указывает, что поведение страницы определяется свойствами, которые можно задавать на уровне страницы и раздела: https://docs.1c-bitrix.ru/pages/cms-basics/page-templates.html#svojstva-stranic.
Рабочее решениеНиже схема из трех шагов: вывод свойства в шаблоне, установка на странице, установка на раздел.
Шаг 1. Выводим canonical вhead через ShowMeta
В шаблоне сайта (обычно в служебной части шапки) добавляем вывод свойства canonical:
<?php
// В head шаблона сайта
$APPLICATION->ShowMeta("canonical", "canonical");
Метод ShowMeta документирован в API CAllMain и выводит мета-тег для указанного свойства:
https://docs.1c-bitrix.ru/api/classes/CAllMain.html#method_ShowMeta
Если canonical уже хранится в свойстве canonical, второй параметр можно не дублировать. Но в практической настройке удобнее явно фиксировать имя meta-поля.
В нужной странице задаем свойство canonical:
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
$APPLICATION->SetPageProperty("canonical", "https://example.ru/catalog/item-1/");
$APPLICATION->SetTitle("Карточка товара");
?>
<p>Контент страницы</p>
<?php require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php"); ?>
Метод SetPageProperty:
https://docs.1c-bitrix.ru/api/classes/CAllMain.html#method_SetPageProperty
Шаг 3. Задаем canonical на уровень разделаКогда нужно единое поведение для раздела, используем SetDirProperty (обычно в .section.php):
<?php
// /catalog/.section.php
$sSectionName = "Каталог";
$arDirProperties = [];
$APPLICATION->SetDirProperty("canonical", "https://example.ru/catalog/");
Метод SetDirProperty:
https://docs.1c-bitrix.ru/api/classes/CAllMain.html#method_SetDirProperty
Шаг 4. Проверяем текущее значение свойства в кодеДля диагностики можно проверить, какое значение реально видит страница:
<?php
$canonical = $APPLICATION->GetProperty("canonical");
if ($canonical !== "") {
echo "<pre>canonical: " . htmlspecialchars($canonical, ENT_QUOTES, "UTF-8") . "</pre>";
}
Метод GetProperty:
https://docs.1c-bitrix.ru/api/classes/CAllMain.html#method_GetProperty
Проверка результатаПроверяем, что canonical реально попал в итоговый HTML страницы.
curl -s https://example.ru/catalog/item-1/ | grep -i canonical
Ожидаемый результат:
<meta name="canonical" content="https://example.ru/catalog/item-1/">
Если у вас в проекте принято использовать <link rel="canonical">, это отдельная реализация в шаблоне. В этой статье рассматривается именно документированная схема через свойства и ShowMeta.
❌ Ошибка: свойство задают, но не выводят.
Причина: есть SetPageProperty, но нет ShowMeta в head.
Как исправить: добавить вызов ShowMeta("canonical", "canonical") в шаблон.
❌ Ошибка: ждут, что значение из раздела применится, но задают на странице.
Причина: путают SetPageProperty и SetDirProperty.
Как исправить: для раздела использовать SetDirProperty.
❌ Ошибка: canonical «пустой» в HTML.
Причина: разное имя свойства при установке и выводе (например, canon_url и canonical).
Как исправить: унифицировать идентификатор свойства во всех местах.
❌ Ошибка: проверяют только в браузере и не видят реальный HTML после правок.
Причина: не выполняют проверку через curl.
Как исправить: всегда проверять итоговую разметку командой из раздела выше.
Где применять- SEO-настройка карточек и разделов каталога.
- Проекты с дублирующими URL в публичной части.
- Миграции и реструктуризация URL, где важно зафиксировать канонический адрес.
- Поддержка больших разделов, где свойства удобнее задавать на уровне
.section.php.
Полезно дополнительно:
- https://viku-lov.ru/blog/bitrix-local-folder-project-structure
- https://viku-lov.ru/blog/migraciya-s-wordpress-na-bitrix-bez-poteri-seo