СЕО специалисты часто просят в постраничной навигации на сайте убрать 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 и выше.