+7 (495) 070 2021
ЧПУ пагинация
#чпу #пагинация #htaccess #php #битрикс

ЧПУ пагинация

СЕО специалисты часто просят в постраничной навигации на сайте убрать get параметры. В Битрикс из коробки именно через ?PAGEN_ реализована пагинация и штатной возможности включить ЧПУ для пагинации нет.

Нам нужно привести ссылки навигации по страницам раздела к виду:
/путь_раздела/page-2/

Изменяем шаблон пагинации компонента system.pagenavigation

В шаблоне компонента system.pagenavigation, нужно включить буферезацию вывода, для этого перед HTML вставить вызов функции:
ob_start();
И после HTML, в конец файла шаблона, вставить php-скрипт для преобразования ссылок пагинации в ЧПУ:
$paging = ob_get_contents();
$paging = preg_replace_callback('/href="([^"]+)"/is', function($matches) {
    $url = $matches[1];
    $newUrl = '';
    if ($arUrl = parse_url($url)) {
        $newUrl .= $arUrl['path'];
	     if (substr($newUrl, -1) != '/') {
			$newUrl .= '/';
	     }
	$newUrl = preg_replace('#(page-[\d]+/)#is', '', $newUrl);
        $newUrl = str_replace(array('index.php', 'index.html'), '', $newUrl);
        parse_str(htmlspecialcharsback($arUrl['query']), $arQuery);
        foreach ($arQuery as $k => $v) {
            if (in_array($k, array('SECTION_CODE'))) {
                unset($arQuery[$k]);
            } elseif (substr($k, 0, 5)=='PAGEN') {
                $newUrl .= 'page-'.intval($v).'/';
                unset($arQuery[$k]);
            }
        }
        $buildQuery = http_build_query($arQuery, '', '&');
        if (strlen($buildQuery)) {
            $newUrl .= '?'.$buildQuery;
        }
    }
    return 'href="'.$newUrl.'"';
}, $paging);
ob_end_clean();
echo $paging;

Создать файл /bitrix/pagen.php с кодом для обработки URL

function __isPathTraversalUri($uri)
{
    if (($pos = strpos($uri, '?')) !== false) {
        $uri = substr($uri, 0, $pos);
    }
    $uri = trim($uri);
    return preg_match("#(?:/|2f|^|\\\\|5c)(?:(?:%0*(25)*2e)|\\.){2,}(?:/|%0*(25)*2f|\\\\|%0*(25)*5c|$)#i", $uri) ? true : false;
}

$newUri = preg_replace('#(page-[\d]+/)#is', '', $_SERVER['REQUEST_URI']);
if (!__isPathTraversalUri($newUri)) {
    $_SERVER['REQUEST_URI'] = $newUri;
}

Подключить обработчик ЧПУ пагинации в .htaccess

php_value auto_prepend_file "путь_document_root/сайт.ру/bitrix/pagen.php"
И так же в .htaccess добавить правило:
RewriteEngine On
RewriteRule ^(.*)/page-([\d]+)/ /$1/?PAGEN_1=$2 [L,QSA]
Данное решение работает для Битрикс версий 15.5 и выше.
Комментарии (1)
  • 27.08.2021 00:53

    На многих хостингах php-директивы не работают, особенно в Apache 2.4 и выше, и команда php_value в .htaccess приведёт либо к ошибке 500, либо просто не сработает.
    Поэтому файл pagen.php можно подключить в главном index.php, до подключения header.php, т.е. первой строкой.

Написать комментарий