Избавляемся от дублирующих страниц в битриксе

В битриксе мы заметили одну особенность в компоненте каталога, при помощи которого выводятся все наши, автомобильные и не только, статьи на сайте.

Статья с адресом http://site.ru/section_1/section_2/section_3/article

Будет доступна по 3 адресам:
http://site.ru/section_1/section_2/section_3/article
http://site.ru/section_1/section_2/article
http://site.ru/section_1/article

То есть до родительского раздела.

Чтобы не лезть в дебри компонента. Решали мы это проблему с помощью канонического тега rel=canonical.

На заметку: данный тег говорит поисковым системам, какой адрес страницы считать главным и показывать в поиске.

Вот что пишет яндекс по этому поводу:

Если на сайте присутствуют группы схожих по контенту страниц, вебмастер может указать для каждой страницы группы предпочитаемый (канонический) адрес, который будет участвовать в поиске.

До этого мы выводили данный тег, когда в адресе присутствовали различные параметры. http://site.ru/section_1/section_2/article?param1=value1¶m2=value2....

До этого у нас было так:


<?php if(!empty($_GET)){ ?>
        <link rel="canonical" href="<?php echo (CMain::IsHTTPS() ? 'https:' : 'http:') ?>//<?php echo SITE_SERVER_NAME . $APPLICATION->GetCurPage() ; ?>"/>
    <?php } ?>

То есть если есть GET параметры в адресе и эта страница не относится к статьям, то выводим тег canonical. C get параметрами это актуально, особенно, когда вы отслеживаете переходы по рекламным каналам.

Что это сулило? При переходе по урлам:
http://site.ru/section_1/section_2/section_3/article
http://site.ru/section_1/section_2/article
http://site.ru/section_1/article

В каноникал будет подставляться текущий адрес страницы и все они могут попасть в индекс. В следствие чего вес страницы размоется либо в индексе останется какая-нибудь из этих страниц.

В файле header.php нашего шаблона мы добавили проверку:


    <?php if(!empty($_GET) && !preg_match('/^\/marki\//i', $APPLICATION->GetCurPage())){ ?>
        <link rel="canonical" href="<?php echo (CMain::IsHTTPS() ? 'https:' : 'http:') ?>//<?php echo SITE_SERVER_NAME . $APPLICATION->GetCurPage() ; ?>"/>
    <?php } ?>

preg_match выполняет проверку по регулярному выражению - если в адресе есть /marki/. Восклицательный знак перед выражением означает отрицание.
То есть ли есть гет параметры и нет /marki/ в адресе - то выводить каноникал.

А вот для компонента каталога статей пришлось модифицировать два модуля компонента: страница разделов и статей.

Как известно, в любом модуле битрикса может присутствовать дополнительный файл - result_modifier.php

Не будем вдаваться в подробности, что это за файл, прочитать можно здесь:
https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=2830

Для разделов

Добавляем код в result_modifier.php:


if($arResult['SECTION_PAGE_URL']){
    $APPLICATION->AddHeadString('<link href="' . (CMain::IsHTTPS() ? 'https:' : 'http:') . '//' . SITE_SERVER_NAME.$arResult['SECTION_PAGE_URL'] . '" rel="canonical" />',true);
}

Для статей

Добавляем код в result_modifier.php:


if($arResult['DETAIL_PAGE_URL']){
    $APPLICATION->AddHeadString('<link href="' . (CMain::IsHTTPS() ? 'https:' : 'http:') . '//'.SITE_SERVER_NAME.$arResult['DETAIL_PAGE_URL'].'" rel="canonical" />',true);
}

Разница здесь в переменных. Полный урл раздела хранится в переменной SECTION_PAGE_URL, статьи - DETAIL_PAGE_URL.

Если вы заметили, используется метод CMain::IsHTTPS() для перехода сайта на https. Об этом процессе мы напишем отдельную статью. В данный момент сайт у нас успешно переезжает :)

Сайт в перспективе должен работать по https, потому что google скоро будет в выдаче обычные сайты помечать, как потенциально опасные.

Собственно, вот и все.

Если у вас будут вопросы или замечания, пишите в комментариях.

И еще статьи из раздела