Bitrix пагинация убрать PAGEN_1

Разработка Зотиков Сергей 3 комментария

SEO-специалисты часто просят в постраничной навигации сайта не использовать get-параметры. В 1C-Bitrix из коробки именно через них реализована пагинация и штатной возможности включить ЧПУ для пагинации не предусмотрено.

Антон Долганин, гуру Bitrix, предложил очень простой вариант реализации красивой навигации без get параметров PAGEN_ еще в 2013 году, в 2015 обновил его, т.к. старое решение перестало работать с bitrix версии 15.5, оригинал статьи – тут.

Задача:

Привести ссылки навигации по страницам раздела сайта на bitrix к виду:

/путь_до_страницы/page-2/

Решение задачи в трех шагах:

Шаг 1 – обновляем шаблон пагинации bitrix#

В шаблоне компонента system.pagenavigation, нужно включить буферизацию вывода, для этого перед HTML вставить вызов функции:

PHP
<?php ob_start(); ?>

и после HTML, в конец файла шаблона, вставить php-скрипт для преобразования ссылок пагинации в ЧПУ:

PHP
<?php
$paging = ob_get_contents();
$paging = preg_replace_callback('/href="([^"]+)"/is', function ($matches) {
    $url = $matches[1];
    $newUrl = '';
    if ($arUrl = parse_url($url)) {
        $newUrl = isset($_SERVER['REAL_FILE_PATH']) && strlen($_SERVER['REAL_FILE_PATH']) ? $_SERVER['REAL_FILE_PATH'] : $_SERVER['SCRIPT_NAME'];
        $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, '', '&amp;');
        if (strlen($buildQuery)) {
            $newUrl .= '?' . $buildQuery;
        }
    }
    return 'href="' . $newUrl . '"';
}, $paging);
ob_end_clean();
echo $paging;

Шаг 2 – Создать файл и поместить в него php-код для обработки URL#

PHP
<?php
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;
}

Шаг 3 – Подключить обработчик ЧПУ пагинации в bitrix#

Чтобы скрипт обработки URL срабатывал до выполнения php кода сайта надо указать в параметре auto_prepend_file настроек php путь к файлу из шага 2.

На большинстве хостингов этот параметр можно установить в .htaccess:

Apache
php_value auto_prepend_file "путь_до_document_root/include/pagen.php"

Посмотреть свой путь до document root очень просто, создайте и запустите php файл с кодом:

PHP
<?php
echo $_SERVER['DOCUMENT_ROOT'];

Вот так за 3 простых шага решается задача создания ЧПУ пагинации на bitrix.

Комментарии 3

  1. Максим

    Автор данной статьи упустил настройку для файла .htaccess
    Необходимо в разделе <IfModule mod_rewrite.c> добавить строку для обработки новой навигации

    Apache
    RewriteRule ^(.*)/page\-([\d]+)/ /$1/?PAGEN_1=$2 [L,QSA]
    1. Олег

      Шаг 2 и 3 как раз решает эту задачу, не нужно это правило.

Поддерживаются `код`, **жирный**, *курсив* и блоки кода

Как оформить
ПишетеПолучится
`npm install`код в строке: npm install
```bash
npm install
npm run build
```
блок кода: три обратные кавычки — отдельной строкой до и после кода; язык подсветки (bash, php, sql) — по желанию, сразу после первых кавычек
**важно**важно
*термин*термин
https://example.comссылка: адрес достаточно вставить как есть
Наверх