+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


При использовании пагинации (в просторечии постранички) на «Битрикс» адреса красотой не блещут. Сначала отображается адрес ЧПУ, а в конце его древний костыль PAGEN_. Разве это дело? Нет, конечно. И вот как исправить положение:

1. Организуем буферизацию вывода system.pagenavigation

Обратите внимание, что для вызова анонимной функции потребуется интерпретатор PHP версии не ниже 5.3.

<? if(!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();

if(!$arResult['NavShowAlways']) {
	if ($arResult['NavRecordCount'] == 0 || ($arResult['NavPageCount'] == 1 && $arResult['NavShowAll'] == false)) {
		return;
	}
}

$strNavQueryString = ($arResult['NavQueryString'] != '' ? $arResult['NavQueryString'].'&amp;' : '');
$strNavQueryStringFull = ($arResult['NavQueryString'] != '' ? '?'.$arResult['NavQueryString'] : '');
ob_start();
?>


******** YOUR TPL *******


<?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('#(pagen[\d]+/)#is', '', $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 .= 'pagen'.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. Модифицируем .htaccess

В файл .htaccess надо добавить строчку:

RewriteRule ^(.*)/pagen([\d]+)/ /$1/?PAGEN_1=$2 [L,QSA]


3. Для «Битрикс» версий ниже 15.5 используем обработчик

AddEventHandler('main', 'OnPageStart', array('CMainhandlers', 'OnPageStartHandler'));
class CMainhandlers {
   public static function OnPageStartHandler() { 
      $newUri = preg_replace('#(pagen[\d]+/)#is', '', $_SERVER['REQUEST_URI']);
      if (!CHTTP::isPathTraversalUri($newUri)) {
         $_SERVER['REQUEST_URI'] = $newUri;
         $GLOBALS['APPLICATION']->reinitPath();
      }
   }
}


4. Для «Битрикс» версий 15.5 и высших

Обработчик не используем. Если ранее использовали, то удаляем.

Создаем файл /bitrix/pagen.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('#(index[\d]+\.html)#is', '', $_SERVER['REQUEST_URI']); 
if (!__isPathTraversalUri($newUri)) { 
    $_SERVER['REQUEST_URI'] = $newUri; 
}


И в файл .htaccess добавьте строчку:

php_value auto_prepend_file "***/bitrix/pagen.php"


Заменив звездочки на ваш док.рут. Обязательно редактируйте файл .htaccess только по FTH/SSH доступам.


Готово!

Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA