В сети популярно решение через буферизацию и скрипт pagen.php, однако в 2026 году при работе с комплексными компонентами (например, bitrix:news с подразделами) оно полностью ломает логику переключения страниц, оставляя пользователя на первой странице. В этой статье мы разберем актуальный фикс этой проблемы.
Пример кода<? // /news/index.php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/pagen.php"); // подключаем файл до header.php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Новости");
...
?>
Пример кода<? // /bitrix/pagen.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;
}
if (isset($_GET['page'])) {
$pageValue = intval($_GET['page']);
if ($pageValue >= 1) {
$pageNumber = $pageValue + 1;
$navNum = 1;
$_GET['PAGEN_'.$navNum] = $pageNumber;
$_REQUEST['PAGEN_'.$navNum] = $pageNumber;
}
}
Пример кода<? // /local/templates/s1/components/bitrix/system.pagenavigation/news/template.php
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
$this->setFrameMode(true);
if(!$arResult["NavShowAlways"])
{
if ($arResult["NavRecordCount"] == 0 || ($arResult["NavPageCount"] == 1 && $arResult["NavShowAll"] == false))
return;
}
$strNavQueryString = ($arResult["NavQueryString"] != "" ? $arResult["NavQueryString"]."&" : "");
$strNavQueryStringFull = ($arResult["NavQueryString"] != "" ? "?".$arResult["NavQueryString"] : "");
ob_start(); // Включаем буферизацию
?>
<!-- Тут шаблон -->
<?
$paging = ob_get_contents();
ob_end_clean();
$paging = preg_replace_callback('/href="([^"]+)"/is', function($matches) use ($arResult) {
$url = $matches[1];
if ($arUrl = parse_url($url)) {
$newUrl = $arUrl['path'];
if (substr($newUrl, -1) != '/') {
$newUrl .= '/';
}
$newUrl = preg_replace('#(page[\d]+/)#is', '', $newUrl);
$queryString = htmlspecialcharsback($arUrl['query'] ?? '');
parse_str($queryString, $arQuery);
$targetPage = null;
$pagenKey = 'PAGEN_' . $arResult["NavNum"];
if (isset($arQuery[$pagenKey])) {
$targetPage = intval($arQuery[$pagenKey]);
} else {
if (isset($arQuery['page'])) {
unset($arQuery['page']);
}
}
unset($arQuery[$pagenKey], $arQuery['SECTION_CODE']);
if ($targetPage !== null) {
$newPageValue = $targetPage - 1;
if ($newPageValue > 0) {
$arQuery['page'] = $newPageValue;
}
}
$buildQuery = http_build_query($arQuery, '', '&');
if (strlen($buildQuery)) {
$newUrl .= '?' . $buildQuery;
}
return 'href="' . $newUrl . '"';
}
return $matches[0];
}, $paging);
echo $paging;
?>