Всем известно, что 1С-Битрикс, особенно не последних версий, плохо оптимизирован под требования SEO-специалистов(адекватные и не очень). Практически каждому веб-разработчику приходилось сталкиваться с однотипными требованиями сеошников: убрать дубли страниц, перевести все урлы на ЧПУ, создать миллионы тегов с уникальными метатегами и т.д. В этой статье я напишу как реализовать некоторые из требований.

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

Дубли страниц

Настройка редиректа с не-www на www:

#nginx:
server {
    server_name "~^(?!www\.).*" ;
    return 301 $scheme://www.$host$request_uri;
}
#apache:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Настройка редиректа с www на не-www:

#nginx:
server {
    server_name "~^www\.(.*)$" ;
    return 301 $scheme://$1$request_uri ;
}
#apache:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

Добавление слеша в конец урла:

#nginx:
rewrite ^([^.]*[^/])$ $1/ permanent;
#apache:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^(.*/[^/\.]+)$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [R=301,L]

Reg.ru

Оптимизация страниц пагинации

Для реализации ЧПУ-страниц пагинации используем код коллеги: Ссылка. Проверено, работает. Требования к виду урла сеошники различные, поэтому в двух местах кода по ссылке нужно не забыть поменять регулярки.

Также в шаблоне компонента system.pagenavigation добавляем код для добавления метатегов страниц пагинации:

if ($arResult["NavPageNomer"] == 2) {
    $APPLICATION->SetPageProperty("robots", "noindex, follow");
    $APPLICATION->AddHeadString('<link rel="prev" href="ВАШ_УРЛ_НА_СТРАНИЦУ_КАТЕГОРИИ">' );
}
elseif ($arResult["NavPageNomer"] > 2) {
    $APPLICATION->SetPageProperty("robots", "noindex, follow");
    $APPLICATION->AddHeadString('<link rel="prev" href="ВАШ_УРЛ_НА_ПРЕДЫДУЩУЮ_СТРАНИЦУ">' );
}
if ($arResult["NavPageNomer"] < $arResult["NavPageCount"]) {
    $APPLICATION->AddHeadString('<link rel="next" href="ВАШ_УРЛ_НА_СЛЕДУЮЩУЮ_СТРАНИЦУ">' );
}

Для того, чтобы на несуществующих страницах пагинации(напр. ?PAGEN_1=100500) выводилась 404 ошибка, пишем в этом же шаблоне:

if ($_GET["PAGEN_" . $arResult["NavNum"]] > 0 && $arResult["NavPageNomer"] != $_GET["PAGEN_" . $arResult["NavNum"]]) {
    define('ERROR_404', 'Y');
    return;
}

Есть требование добавлять к титлу страницы пагинации её номер, для этого добавляем в init.php обработчик:

AddEventHandler("main", "OnEpilog", "OnEpilogHandler");
function OnEpilogHandler()
{
    global $APPLICATION;
    if (!defined('ERROR_404') && intval($_GET["PAGEN_1"]) > 0) {
        $APPLICATION->SetPageProperty("title", $APPLICATION->GetPageProperty("title") . "– " . intval($_GET["PAGEN_1"]) . " страница");
    }
}