Установка и настройка rel canonical Битрикс
Вариант 1. С удалением всех $_GET параметров из url
Важно! На всех страницах будут вырезаны $_GET параметры для атрибута rel canonical, например: PAGEN_.*,SHOWALL_.* и т.д.
Для этого необходимо в header.php (как правило) вставить следующий код:
<?php
/*полный url страницы*/
$url = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
/*избавляемся от $_GET переменных*/
$url = explode('?', $url);
$url = $url[0];
/*на главной отрежем слеш в конце*/
if($APPLICATION->GetCurPage()=='/')
{
$url=trim($url,'/');
}
$APPLICATION->SetPageProperty("canonical", $url );
unset($url);
?>
<link rel="canonical" href="<?$APPLICATION->ShowProperty("canonical")?>"/>
У меня в файле local/templates/имя-шаблона/header.php это выглядит так:
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die(); ?>
<?php
use Bitrix\Main\Page\Asset;
$APPLICATION->AddHeadScript(ASSETS_URL . 'js/main.js');
// Для подключения скриптов
// Подключение мета тегов или сторонних файлов
Asset::getInstance()->addString("<link rel='shortcut icon' href='" . SITE_TEMPLATE_PATH . "/favicon.ico' />");
?>
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><? $APPLICATION->ShowTitle() ?></title>
<? $APPLICATION->ShowHead(); ?>
<? //Наш canonical ?>
<?php
/*полный url страницы*/
$url = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
/*избавляемся от $_GET переменных*/
$url = explode('?', $url);
$url = $url[0];
/*на главной отрежем слеш в конце*/
if($APPLICATION->GetCurPage()=='/')
{
$url=trim($url,'/');
}
/*занесем значение в отложенную функцию */
/*и оставим таким образом возможность переопределения в component_epilog.php других компонентов*/
$APPLICATION->SetPageProperty("canonical", $url );
unset($url);
?>
<link rel="canonical" href="<?$APPLICATION->ShowProperty("canonical")?>"/>
<? //Наш canonical конец ?>
</head>
<body>
<? $APPLICATION->ShowPanel(); ?>
Вариант 2. С частичной обрезкой $_GET параметров, например, только в каталоге
Для этого необходимо в header.php (как правило) вставить следующий код:
<? //Наш canonical ?>
<?php
/*полный url страницы*/
$url = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
/*на главной отрежем слеш в конце*/
if($APPLICATION->GetCurPage()=='/')
{
$url=trim($url,'/');
}
/*оставляем возможность переопределить в component_epilog.php других компонентов*/
$APPLICATION->SetPageProperty("canonical", $url );
?>
<link rel="canonical" href="<?$APPLICATION->ShowProperty("canonical")?>"/>
<? unset($url); ?>
<? //Наш canonical конец ?>
Сам код удаления переменных
Удалим нужные нам переменные в component_epilog.php нужного компонента с пагинацией или на странице вывода элементов инфоблока
PAGEN_.* - идентификатор пагинации каталога, могут быть любые $_GET переменные
У меня в файле local/templates/имя-шаблона/templates-parts/uslugi/list.php это выглядит так:
<?php
$context = \Bitrix\Main\Application::getInstance()->getContext();
$uri = new \Bitrix\Main\Web\Uri($context->getRequest()->getRequestUri());
$uri->deleteParams(['PAGEN_' . $res->NavNum ?? 1 ]);
$uri->deleteParams(['SHOWALL_' . $res->NavNum ?? 1 ]);
$protocol = $context->getRequest()->isHttps() ? 'https://' : 'http://';
$href = $protocol . $context->getServer()->getHttpHost() . $uri->getUri();
$APPLICATION->SetPageProperty('canonical', $href);
//$res->NavNum - может храниться в $arrResult, а может в результате CIBlockElement::GetList,
//в зависимости используете ли вы модуль каталог или пишите каталог на лицензии старт
//вставить данный код можно в component_epilog.php или на странице с запросом CIBlockElement::GetList