Часто в СЕО ставится задача отсечь случайные GET параметры, чтобы поисковики не индексировали дубли страниц. Задача эта не совсем тривиальная, потому-то админка Битрикса активно использует GET параметры для навигации по разделами и для фильтров, поэтому .htaccess для этого не подходит.
Таким образом нам надо отсечь "запрещенные" параметры только для неавторизованных пользователей. Рассмотрим диаграмму выполнения страницы в CMS Битрикс. Нам нужна фаза после определения пользователя. В нашем случае это 10.1 ("Определение пользователя, авторизация пользователя, завершение сеанса, регистрация (в зависимости от параметров в запросе)"). Ближайшее за этой фазой событие OnBeforeProlog. Это событие и будем использовать для нашей задачи.
Общие для сайта события как правило обрабатываются в файле /bitrix/php_interface/init.php или /bitrix/php_interface/ID_сайта/init.php для обработчика конкретного сайта. Поэтому добавьте туда следующие строки.
<?php
AddEventHandler("main", "OnBeforeProlog", "myOnBeforePrologHandler");
function myOnBeforePrologHandler() {
global $USER;
$get = array('PAGEN_1', 'sphrase_id', '_openstat', 'utm_source', 'gclid');
$n = count($_GET);
if($n > 0 && !$USER->IsAuthorized()) {
$aviable = array();
foreach($_GET as $key => $v){
if(in_array($key, $get)) $aviable[$key] = $v;
}
$m = count($aviable);
if($m != $n){
$RU = @parse_url($_SERVER['REQUEST_URI']);
$url = $RU['path'];
if($m > 0){
$a = array();
foreach($aviable as $key => $v){
$a[] = rawurlencode($key).'='.rawurlencode($v);
}
$url .= '?'.implode('&', $a);
}
LocalRedirect($url, false, '301 Moved permanently');
}
}
}
?>
В строке 06 указан массив $get
разрешенных GET параметров. В нашем случае это переменная пагинации (постраничного вывода) PAGEN_1
и переменные систем статистики посещений. При необходимости можно добавить туда свои переменные. При наличии GET переменной в URL, не входящей в указанный массив, страница перенаправляется на эту же страницу, но с отсеченныйми запрещенными параметрами, сохраняя таким образом посетителя.
Следует заметить, что такой прием следует использовать осознанно, потому что в данном случае невозможно проверить логику GET параметров. Например, может быть ситуация, когда для одного компонента один параметр является валидным, а для другого нет. В таких случаях проверку валидности параметров надо перекладывать на компоненты или код, вызывающий эти компоненты.