Убрать get параметр из url 1с битрикс
Для поисковых систем, адреса страниц, которые даже незначительно отличаются, но при этом содержат одну и ту же информацию - это разные страницы. А, как известно, дубли страниц - это плохо: это не уникальная информация, вес и значимость основной страницы снижается, если присутствуют дубли этой страницы. А это негативно влияет на продвижение страницы и сайта в целом для поисковых систем.
Для поисковых систем, адреса страниц, которые даже незначительно отличаются, но при этом содержат одну и ту же информацию - это разные страницы. А, как известно, дубли страниц - это плохо: это не уникальная информация, вес и значимость основной страницы снижается, если присутствуют дубли этой страницы. А это негативно влияет на продвижение страницы и сайта в целом для поисковых систем.
Если в Яндекс.Вебмастере, вы обнаружили ошибку "Некоторые страницы сайта дублируют друг друга", то вероятно ваш 1С-Битрикс генерирует однотипные страницы (дубли). Почему это происходит?
Также в ряде случаев, нежелательно чтобы поисковые системы индексировали некоторые разделы сайта, например раздел администратора, личный кабинет пользователя, поиск по сайту (который также может создавать дубли страниц).
Чтобы этого избежать, необходимо правильно настроить файл robots.txt, который задает правила индексирования для поисковых роботов.
Текст в ссылке в виде ?view=list, или любой другой текст после знака вопроса - это get-параметры. Они используются для передачи внутри системы каких-либо данных. Чтобы Яндекс или Google не индексировали ссылки с такими параметрами, есть специальное правило для очистки ссылок от get-параметров: Clean-param.
Яндекс.Вебмастер позволяет увидеть примеры страниц-дублей. Вы можете просмотреть эти страницы, и определить get-параметры, которые создают дубли.
Пример списка очистки параметров Clean-param для 1С-Битрикс в robots.txt
Запрет индексации определенных разделов сайта 1С-Битрикс
Некоторые разделы сайта, которые могут создавать дубли страниц или не несут полезной информации, лучше запретить для индексации поисковыми системами. Например страницы поиска, административного раздела.
Для это в robots.txt прописываем следующий код:
Подключение карты сайта sitemap.xml в robots.txt на 1С-Битрикс
Необходимо также указать поисковым роботам, где находится файл sitemap.xml с картой сайта. Если он располагается у вас в корне сайта и имеет стандартное название, то поисковые роботы найдут его самостоятельно. Но явно указать его местонахождение лишним не будет. Для этого прописываем в файле robots.txt код:
Указать поисковым роботам главное зеркало сайта в robots.txt
Поэтому для указания, какой адрес считать главным зеркалом, нужно добавить в файл robots.txt код:
Пример всего кода файла robots.txt для 1С-Битрикс
Это основные настройки файла robots.txt. Для его корректной настройки, нужно проанализировать страницы сайта, выявить те, которые не нужно индексировать, и добавить их в исключения согласно данной инструкции.
Настройка файлов robots.txt и .htaccess входит в услугу по базовой поисковой оптимизации сайта в Студии Артано. Если не хотите разбираться самостоятельно, можно заказать у нас)).
Продолжаем лупить статьи на тему «Битрикс не так уж и плох, если его доработать».
На этот раз разговор пойдет на тему «url_rewrite», потому как я считаю, что текущий вариант вообще не идеален.
А идеальным я считаю вариант маршрутизации в микрофреймворках, например Slim (или тот же Lumen), вообщем тех, которые дружат с PSR-7.
Кому интересно, го под кат.
Кому не интересно, ну тут уж сами решайте ;-)
INTRO
На самом деле мои предыдущие статьи носили более менее абстрактный характер (ну кроме статьи про Juggernaut пожалуй), поэтому в данном посте постараюсь меньше писать теории и побольше кода.
Кстати про Juggernaut
- время
- рефакторинг
- мне полюбился TDD, так что рефакторинг остановился до тех пор пока не напишу тесты
- направление развитие библиотеки как оказалось я не совсем еще до конца определил
Но это как говорить «совсем другая история», поэтому вернемся к тому, о чем собственно данная статья: роутинг.
UrlRewrite by Bitrix
Порядок маршрутизации я думаю лучше изобразить схемкой (и понятно, и наглядно):
Что это все значит:
include bitrix/urlRewrite.php
Подключаем файл который занимается маршрутизацией (ну это я думаю и так все поняли).
Вообще данный пункт (и все что выше на блок схеме) — это заслуги .htaccess:
include dbconn.php
Подключаем базу.
Зачем? Непонятно, т. к. запросов к базе дальше нет и работа идет только с файловой системой.
Я конечно не опускался в реализацию классов для работы с файлами, но если им нужно что-либо от базы, то это не иначе как печально :-(
decode request page (for UTF-8)
Все понятно из названия, кодирование REQUEST_URI.
Зачем? Зачем Битрикс любит Windows-1251? Без понятия. Но это будет продолжаться вечно (и это инсайдерская информация).
include /urlRewrite.php
Собственно подключаем сами правила маршрутизации.
process Url
Немного странные действия, но все же происходит следующее:
Если есть GET параметр SEF_APPLICATION_CUR_PAGE_URL, то приравниваем REQUEST_URI к его значению, а затем переписываем все зависимые переменные и глобальные массивы ($_GET, $_SERVER, …)
- Парсим параметр CONDITION.
- Заменяем параметр CONDITION на RULE в REQUEST_URI
- Добавляет в $_GET и $_REQUEST переменные из правила маршрутизации.
- Проверяем существует ли указанный файл, валидный ли у него путь и не является ли он административным (upload, bitrix, bitrix/services, bitrix/groupdavphp).
- Если все ок, то подключаем.
Много неясностей, зачем сделано так, а не иначе?
Ну и много неясностей, зачем вообще это сделано?
Так что теперь перейдем к идеальному варианту Slim’a.
UrlRewrite by Slim
Как делает этот замечательный фреймворк:
Легко и непринужденно цепляемся к нужному действию, с нужным маршрутом, параметрами и реализацией.
UrlRewrite by Juhhernaut
Ну, а теперь пробуем все это миксануть.
Выкидываем из Slim'a указание метода и собственно реализацию действия, вместо нее будет путь до файла.
Для начала обозначим синтаксис привязки маршрутов к реальным физически файлам (по факту это является мануалом использования):
По факту, если реализацию маршрутов оставить на совести компонентов, то достаточно будет прописать следующую конструкцию (да, так тоже можно ;-) ):
Данный файл нужно (можно) назвать urlrewrite.php, кинуть его в папку /local/ и внести правки в .htaccess файл, который лежит в корне.
Делаем красивую универсальную ЧПУ-постраничку в Битрикс (а также выкидываем мусор из постранички)
Есть в Битрикс места, за которые местами стыдно. Одно из них - это ПОСТРАНИЧКА (оттакенными буквами, ага). Это даже отличительная черта Битрикс - PAGEN_ - все, Битрикс. Избавляемся от этого
Идея проста - мы буферизируем вывод шаблона system.pagenavigation (да, поработать ручками придется). В начале ставим ob_start();, в конце небольшие махинации с preg_replace, и на выходе имеем красивые ссылки. Но это пока только ссылки. Код я разбиратьне буду, скачать вы сможете его в конце сего поста. Замечу только, что внутри колбека можно вырезать ненужные get-параметры. Как вариант, эту обработку можно вынести в функцию, которую дополнять теми параметрами, которые вы хотите удалять постоянно. Место очистки отмечено красным. И еще момент - используется анонимная функция, что требует PHP минимум 5.3 (можете переписать на старый вызов колбека).
Да, хочу сразу предупредить - получилось не совсем универсально, я сделал только для PAGEN_1 (а есть еще PAGEN_2 и так далее), цифра в конце увеличивается при каждом новом вызове постранички на странице. Но это бывает крайне редко. И в этом случае ЧПУ-постраничка, как правило, одна.
Значит, шаблон красивый вывели
Алгоритм не накладывает требования на шаблон. Более того, вы можете взять и применить его на ваши текущие шаблоны. Старые PAGEN продолжат работать также.
Так, далее надо поместить в htaccess волшебную строчку в секцию IfModule mod_rewrite.c:
Остался последний штрих. Нам нужно GetCurPage и GetCurDir оставить неизменными, чтобы получилось абсолютно безболезненно (и незаметно) для Битрикс. Для этого мы делаем финт таким обработчиком:
Вот собственно и вся магия. Комментарии подробные считаю излишними, разработчики разберутся.
Спросили - а как убрать PAGEN_, но не ЧПУ делать, а просто приятные параметры. К примеру, page=xxx. Тут все проще.
Работа с URL-адресами в Bitrix является одним из важных моментов в работе всей системы. До появления ядра версии D7 работа с URL адресами производилась посредством классов CMain::GetCurPageParam и DeleteParam. На нашем сайте ранее публиковались примеры формирования URL с передачей многомерных массивов, а также произвольных URL посредством использования GetCurPageParam.
В D7 для работы с ссылками появился аналог этим классам – Uri. Работа с классом в некоторых моментах стала сложнее, т.к. каждый аспект работы класса стал более самостоятельным, реализованным в отдельных методах.
Класс Uri в Bitrix D7
Примеры работы c классом Uri
В представлении класса Uri в системе Bitrix каждый URL является объектом, с параметрами которого класс и работает посредством отдельных методов. Поэтому в перед тем как работать с URL необходимо инициализировать объект класса Uri.
Создание объекта из URL строки
Создать объект класса Uri мы можем из обычной строки URL, после чего уже работать с этим объектом.
Создание объекта из текущего URL
Довольно часто приходится работать с параметрами URL текущей страницы. Для работы с URL текущей страницы аналогично необходимо создать объект класса Uri. Получить текущий URL, и создать объект класса для работы с ним можно таким образом:
После того как создан объект класса Uri, мы можем работать с методами класса. Так к примеру, мы можем получить составляющие части сайта.
Методы класса Uri
Таблица доступных методов в данный момент времени:
Метод | Описание | С версии |
---|---|---|
addParams | Метод добавляет параметры в запрос или заменяет существующие параметры. | 15.5.10 |
deleteParams | Метод удаляет параметры из запроса. | 15.5.10 |
getFragment | Метод возвращает фрагмент. | 14.0.15 |
getHost | Метод возвращает хост. | 14.0.15 |
getLocator | Метод возвращает URI без фрагмента. | 15.5.10 |
getPass | Метод возвращает пароль. | 14.0.15 |
getPath | Метод возвращает путь. | 14.0.15 |
getPathQuery | Метод возвращает путь с запросом. | 14.0.15 |
getPort | Метод возвращает номер порта. | 14.0.15 |
getQuery | Метод возвращает запрос | 14.0.15 |
getScheme | Метод возвращает схему. | 14.0.15 |
getUri | Метод возвращает URI с фрагментом, если он имеется. | 15.5.10 |
getUser | Метод возвращает пользователя. | 14.0.15 |
setHost | Метод устанавливает хост | 14.0.15 |
setPath | Метод устанавливает путь. | 15.5.10 |
setUser | Метод устанавливает пользователя. | 16.5.7 |
setPass | Метод устанавливает пароль. | 16.5.7 |
Изменение параметров в URL
Методы класса Uri позволяют так же добавлять параметры в существующий URL, а также менять различные составляющие URL-адреса.
Таким образом, можно довольно гибко оперировать данными URL в различных участках кода. К примеру, это может потребоваться тогда, когда необходимо сформировать URL-адреса для списка ссылок в шаблоне компонента. Класс будет работать везде где подключается ядро, Bitrix-а, поэтому его можно использовать как в компонентах, так и в отдельных скриптах-обработчиках, к примеру, в ajax.
В сегодняшней статье я решил разобрать весьма полезную функцию, удаляющую любой GET-параметр из строки. Где это может быть нужно? Допустим, Вы делаете навигацию по страницам. И Вам необходимо сделать универсальный скрипт её создания, добавляя к текущему URL параметр page. Однако, текущий URL может быть уже с параметром page. В итоге, получится, например, такой URL: "/?page=5&page=7". Тогда как правильный должен быть: "/?page=7". Таким образом, необходимо сначала удалить параметр page, а уже потом скрипт создания навигации по страницам сделает своё дело.
Привожу сразу код функции, которая это делает:
function deleteGET($url, $name, $amp = true) $url = str_replace("&", "&", $url); // Заменяем сущности на амперсанд, если требуется
list($url_part, $qs_part) = array_pad(explode("?", $url), 2, ""); // Разбиваем URL на 2 части: до знака ? и после
parse_str($qs_part, $qs_vars); // Разбиваем строку с запросом на массив с параметрами и их значениями
unset($qs_vars[$name]); // Удаляем необходимый параметр
if (count($qs_vars) > 0) < // Если есть параметры
$url = $url_part."?".http_build_query($qs_vars); // Собираем URL обратно
if ($amp) $url = str_replace("&", "&", $url); // Заменяем амперсанды обратно на сущности, если требуется
>
else $url = $url_part; // Если параметров не осталось, то просто берём всё, что идёт до знака ?
return $url; // Возвращаем итоговый URL
>
echo deleteGET("http://mysite.ru/?view=category&page=5&id=5", "page");
?>
Не очень сложный скрипт, однако, он выполняет весьма сложную задачу - удаление GET-параметра из URL. Ведь тут имеется огромное количество нюансов. Просто удалить строку - легко, но ведь нужно, чтобы исчез "?", если не осталось больше параметров. Нужно, чтобы исчез "&" перед удалённым параметром, но при условии, что он был не первый в строке запроса. Нужно, чтобы удалился & после параметра, но при условии, что он был не последний. Но при этом нельзя удалить сразу и спереди, и сзади амперсанд, иначе пострадают параметры до и после удаляемого. Видите, сколько нюансов, в казалось бы простой задаче? Данная же функция всё это учитывает.
Вот так можно легко удалить GET-параметр из URL, вызвав функцию из этой статьи.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 5 ):
Зачем такие сложности с разделением ссылки на 2 части? Есть же pparse_url
А ещё есть $_SERVER['QUERY_STRING']. Ну, это если сокращаемый URL и URL текущей страницы совпадают.
А еще есть strTok(), которая "отсекает" все вместе переданным токеном.
Чуток переделанная функция которая принимает удаляет нужные ключи function deleteGET($url, $names = []) < $url_part = parse_url($url); //разбиваем адресную строку на массив parse_str($url_part['query'], $get_part); //получаем с адресной строки get параметры (вторая переменаая уже массив "$get_part") //проходимся по массиву находим и удаляем нужные ключи foreach ($names as $v)< unset($get_part[$v]); >//если есть хотя бы 1 get параметр собираем адресную строку и отдем ее if (count($get_part) > 0) < $url = $url_part['path'] . '?' .http_build_query($get_part); >//если get параметров нет просто возарвешь адресную строку без get парамертров else $url = $url_part['path']; return $url; // Возвращаем итоговый URL > echo deleteGET("http://mysite.ru/?view=category&page=5&id=5", "page");
Читайте также: