- Настройка ЧПУ в 1С-Битрикс
- Bitrix — UrlRewrite (feat. Juggernaut)
- INTRO
- Кстати про Juggernaut
- UrlRewrite by Bitrix
- UrlRewrite by Slim
- UrlRewrite by Juhhernaut
- Битрикс. Система обработки адресов
- Правила обработки
- Подключение системы обработки адресов
- urlrewrite. Написать правило для перенаправления на элемент bitrix.catalog
- Обработка адресов
- Понятие обработки адресов
- Правила обработки
- Подключение системы обработки адресов
- Поддержка компонентов 2.0
- Смотрите также
- Пользовательские комментарии
Настройка ЧПУ в 1С-Битрикс
Самый главный файл в 1С-Битрикс для настройки ЧПУ это urlrewrite.php, который находиться в корневой папке вашего сайта. В нем прописаны правила обработки адресов. Эти правила также создаются в админке сайта на странице «Настройка правил обработки адресов» по следующему пути
Настройки ->Настройки продукта -> Обработка адресов -> Правила обработки
ваш сайт/bitrix/admin/urlrewrite_list.php?lang=ru
Но как правила вручную эти адреса не прописывают их указывают в настройках компонента или инфоблока
При сохранение компонента создаются правила в urlrewrite.php, для этого вы должны корректно настроить ЧПУ в настройках компонента в режиме правки
Для не комплексного компонента создать правила сложнее, их скорее всего придется править вручную в файле. Ниже код правила, позволяющий открывать страницы в которых могут быть любые буквы и цифры. Также обратите внимание на .* в конце, эта точка и звездочка нужна для того, что бы корректно открывать адреса с GET переменными, например когда после сохранения страницы у вас появляется параметр /?clear_cache=Y
Если не указать эти символы в конце, то отобразится 404 ошибка, т.е. страница или раздел не будут найдены.
Правило для комплексного компонента создается автоматически, после сохранения компонента, править вручную его не нужно:
Источник
Bitrix — UrlRewrite (feat. Juggernaut)
Продолжаем лупить статьи на тему «Битрикс не так уж и плох, если его доработать».
На этот раз разговор пойдет на тему «url_rewrite», потому как я считаю, что текущий вариант вообще не идеален.
А идеальным я считаю вариант маршрутизации в микрофреймворках, например Slim (или тот же Lumen), вообщем тех, которые дружат с PSR-7.
Кому интересно, го под кат.
Кому не интересно, ну тут уж сами решайте 😉
INTRO
На самом деле мои предыдущие статьи носили более менее абстрактный характер (ну кроме статьи про Juggernaut пожалуй), поэтому в данном посте постараюсь меньше писать теории и побольше кода.
Кстати про Juggernaut
Документация будет в скором времени, к сожалению есть некоторые преграды:
- время
- рефакторинг
- мне полюбился TDD, так что рефакторинг остановился до тех пор пока не напишу тесты
- направление развитие библиотеки как оказалось я не совсем еще до конца определил
Но это как говорить «совсем другая история», поэтому вернемся к тому, о чем собственно данная статья: роутинг.
UrlRewrite by Bitrix
Порядок маршрутизации я думаю лучше изобразить схемкой (и понятно, и наглядно):
Что это все значит:
include bitrix/urlRewrite.php
Подключаем файл который занимается маршрутизацией (ну это я думаю и так все поняли).
Вообще данный пункт (и все что выше на блок схеме) — это заслуги .htaccess:
fix request_uri for IIS
Данный пункт, судя по комменту в коде, ответственен за какие то косяки IIS (бедняга MS), за какие я не в курсе, но логика следующая:
если QUERY_STRING имеет вид «wtf=404;http(s)://wtf.ru», то все GET параметры запроса чистятся и данная конструкция убирается из адреса.
На вопрос «что проиходит?» я не могу дать ответа, так что едем дальше.
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, …)
process urlRewrite
О, да!
Мы до него добрались.
Собственно что происходит:
- Парсим параметр 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 файл, который лежит в корне.
И собственно все. Простой и понятный роутинг у вас в кармане.
Источник
Битрикс. Система обработки адресов
Обработка адресов (UrlRewrite) применяется для того, чтобы скрипт мог отвечать не только по своему физическому, но и по любому другому указаному адресу. Например, можно задать настройки обработки адресов, чтобы скрипт в файле /folder/index.php , отвечающий по адресу
отвечал также по адресу
Адрес, по которому будет отвечать скрипт, не должен физически существовать на сервере. Если такой адрес физически существует, то будет вызван скрипт по этому адресу. Система обработки адресов запущена в этом случае не будет.
Правила обработки
Правила обработки адресов настраиваются отдельно для каждого сайта и хранятся в корне сайта в файле urlrewrite.php . Файл содержит массив $arUrlRewrite , каждая запись которого является правилом обработки адреса. Файл urlrewrite.php имеет следующий вид:
Каждое правило должно содержать уникальное в рамках сайта условие выполнения правила. Условие выполнения записывается в ключ CONDITION массива и является шаблоном регулярного выражения. Например, условие:
указывает, что данное правило должно применяться для всех адресов, которые начинаются с подстрок вида:
Правило может содержать адрес физически существующего скрипта, который будет подключен при выполнении условия. Этот адрес записывается в ключ PATH . Например, если в системе обработки адресов зарегистрировано правило:
и пользователь запросил URL
которого физически не существует, то система обработки адресов подключит скрипт:
Правило может содержать строку замены, которая записывается в ключ RULE . Если строка замены установлена, то адрес реально существующего подключаемого скрипта формируется заменой регулярным выражением условия выполнения (шаблона выражения) на конкатенацию физического пути (ключ PATH ) и строки замены (ключ RULE ). Например, если в системе обработки адресов зарегистрировано правило:
и пользователем запрошена страница:
то для формирования адреса скрипта, который будет подключен, выполнится код:
и будет подключен скрипт:
Правило может содержать имя компонента, который создал это правило. Это имя записывается в ключ ID . При автоматическом пересоздании файла правил urlrewrite.php с помощью средств административной части сайта пересоздаются только правила, у которых заполнен ключ ID .
Подключение системы обработки адресов
Перед началом использования система обработки адресов должна быть подключена на сайте. Для этого необходимо:
- если на веб-сервере настроена обработка ошибки 404 (например, для Apache установлена директива ErrorDocument 404 /404.php ), то надо изменить файл 404.php в корне сервера, вставив в самое начало:
- если для Apache используеся модуль mod_rewrite , то в .htaccess надо указать:
Источник
urlrewrite. Написать правило для перенаправления на элемент bitrix.catalog
Как при помощи urlrewrite.php выполнить перенаправление на виртуальную страницу? Например на страницу элемента каталога (bitrix.catalog)?
Записываю следующее правило:
array(
«CONDITION» => «#^/catalog/#»,
«RULE» => «»,
«ID» => «»,
«PATH» => «/catalog/catalog_element_code»,
)
и перенаправления не происходит.
Если в PATH прописать реально существующий физический файл — всё работает, а с путями к секциям и элементам каталога (то есть с виртуальными страницами) — не работает.
Подскажите пожалуйста, что не так?
Цитата |
---|
Поясните, по какому адресу и что должно выводиться/открываться. |
Есть некоторый каталог (созданный при помощи комплексного компонента bitrix.catalog), есть инфоблок, связанный с этим каталогом.
Настройки инфоблока:
URL страницы раздела: #SITE_DIR#/catalog/#SECTION_CODE_PATH#/
URL страницы детального просмотра: #SITE_DIR#/catalog/#ELEMENT_CODE#
Настройки компонента bitrix.catalog:
Управление адресами страниц > Раздел: #SECTION_CODE_PATH#/
Управление адресами страниц > Детальная информация: #ELEMENT_CODE#
Необходимо при помощи urlrewrite делать перенаправление на URL определённой секции или элемента.
Проблема в том, что в виде, как я написал перенаправление не работает — наверное из-за того, что реально не существует файла element_code и папок section1_code, section11_code/section111_code/ :
Подобная проблема, которую не могу решить.
в корне сайта есть bitrix:catalog с параметрами:
«SEF_URL_TEMPLATES» => array(
«sections» => «»,
«section» => «#SECTION_CODE_PATH#»,
«element» => «#SECTION_CODE_PATH#/#ELEMENT_CODE#»,
«compare» => «compare.php?action=#ACTION_CODE#»,
),
в urlrewrite есть следующие правила:
array(
«CONDITION» => «#^/(.*)/brand/([a-zA-Z0-9\\-_]+)/\$#»,
«RULE» => «SECTION_CODE_PATH=\$1&BRAND=\$2»,
«ID» => «»,
«PATH» => «/index.php»,
),
array(
«CONDITION» => «#^/(.*)#»,
«RULE» => «»,
«ID» => «bitrix:catalog»,
«PATH» => «/index.php»,
),
пример:
1) сайт/категория1/категория2
2) сайт/категория1/категория2/brand/test/
Почему на эти запросы показываются разные элементы инфоблока, вернее для второго случая «Раздел не найден»? ($_REQUEST[«BRAND»] никак не обрабатываю)
Собственно, я не уверен что bitrix:catalog опирается именно на SECTION_CODE_PATH при формировании результата. (пробовал SECTION_CODE_PATH,
SECTION_CODE, CODE)
Источник
Обработка адресов
Понятие обработки адресов
Обработка адресов (UrlRewrite) применяется для того, чтобы скрипт мог отвечать не только по своему физическому, но и по любому другому указаному адресу. Например, можно задать настройки обработки адресов, чтобы скрипт в файле /fld/c.php, отвечающий по адресу
отвечал также по адресу
Адрес, по которому будет отвечать скрипт, не должен физически существовать на сервере. Если такой адрес физически существует, то будет вызван скрипт по этому адресу. Система обработки адресов запущена в этом случае не будет.
Правила обработки
Правила обработки адресов настраиваются отдельно для каждого сайта и хранятся в корне сайта в файле urlrewrite.php. Файл содержит массив $arUrlRewrite, каждая запись которого является правилом обработки адреса. Файл urlrewrite.php имеет следующий вид:
Каждое правило должно содержать уникальное в рамках сайта условие выполнения правила. Условие выполнения записывается в ключ «CONDITION» массива и является шаблоном Perl-совместимого регулярного выражения. Например, условие:
указывает, что данное правило должно применяться для всех адресов, которые начинаются с подстрок вида:
Правило может содержать адрес физически существующего скрипта, который будет подключен при выполнении условия. Этот адрес записывается в ключ «PATH«. Например, если в системе обработки адресов зарегистрировано правило:
и пользователь запросил страницу:
которая физически не существует, то система обработки адресов подключит скрипт:
Правило может содержать правило замены, которое записывается в ключ «RULE«. Если правило замены установлено, то адрес реально существующего подключаемого скрипта формируется заменой регулярным варажением условия выполнения (шаблона выражения) на конкатенацию физического пути (ключ «PATH«) и правила замены (ключ «RULE«). Например, если в системе обработки адресов зарегистрировано правило:
и пользователем запрошена страница:
то для формирования адреса скрипта, который будет подключен, выполнится код:
и будет подключен скрипт:
Если в системе обработки адресов зарегистрировано правило:
и пользователем запрошена страница:
то для формирования адреса скрипта, который будет подключен, выполнится код:
и будет подключен скрипт:
Правило может содержать имя компонента, который создал это правило. Это имя записывается в ключ «ID«. При автоматическом пересоздании файла правил urlrewrite.php с помощью средств административной части сайта пересоздаются только правила, у которых заполнен ключ «ID«. Эти правила пересоздаются на основании анализа физических файлов в папке сайта. Правила с пустым ключом «ID» при автоматическом пересоздании файла правил не изменяются.
Подключение системы обработки адресов
Перед началом использования система обработки адресов должна быть подключена на сайте. Для этого необходимо:
- если у вас на веб-сервере настроена обработка ошибки 404 (например, для Apache установлена директива ErrorDocument 404 /404.php ), то вы должны изменить файл /404.php, вставив в самое начало файла команду:
- если вы для Apache используете модуль mod_rewrite, то в его настройках вы можете указать (например, как в штатной установке в файле .htaccess):
Примеры правил и условий для модуля mod_rewrite
- Настройка переадресации (301 редирект) на папки со слешем ( / ) в конце:
- Переадресация (301 редирект) с индексной страницы index.php на саму папку (корень) для всех страниц сайта:
Поддержка компонентов 2.0
При добавлении на страницу компонента с поддержкой ЧПУ («человеко-понятный URL«) (если файл сохраняется с помощью API), автоматически создаётся правило обработки адреса. Если страница создаётся не с помощью API, а, например, записывается через FTP, то необходимо выполнить пересоздание правил (кнопка на панели инструментов на странице настройки правил обработки адресов).
Поддержка ЧПУ включается в компоненте с помощью предопределённого входного параметра SEF_MODE. При этом в предопределённом входном параметре SEF_FOLDER устанавливается папка, в которой работает компонент. Папка может быть виртуальной (т.е. физически может не существовать). При сохранении страницы с размещённым на ней компонентом, переключенным в режим ЧПУ (параметр SEF_MODE равен Y), через стандартный интерфейс правило обработки адресов создаётся следующим образом: в ключ условия применения шаблона («CONDITION«) записывается регулярное выражение, полученое из папки в параметре SEF_FOLDER, в ключ «ID» записывается имя компонента, в ключ пути («PATH«) записывается физический адрес страницы.
Например, пусть компонент «bitrix:catalog» размещён на странице /fld/c.php и его подключение выглядит следующим образом:
Тогда при сохранении страницы /fld/c.php в системе обработки адресов добавится запись:
Таким образом, при запросе адресов, начинающихся со строки /mycatalog/, будет подключаться скрипт /fld/c.php. В этом скрипте запрошенный адрес может быть проанализирован и выполнены требуемые действия.
Смотрите также
- ЧПУ в курсе Администратор Базовый.
- Настройка ЧПУ в курсе Разработчик Bitrix Framework.
- Работа комплексного компонента в SEF режиме в курсе Разработчик Bitrix Framework.
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.
Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
Цитата |
---|
Борис Байзулаев пишет: Адрес физического файла, подключенного в результате обработки адреса записывается в Код $_SERVER[«REAL_FILE_PATH»] |
Упрощенный вариант правила, решающий проблему, описанную Денисом Мальцевым в предыдущем комментарии.
Одна интересная особенность, которую надо учитывать.
Допустим вам надо сделать преобразование такого вида, чтобы при открытии страницы /news/445.php происходило преобразование в /news/detail.php?ID=445
Можно использовать такое правило
Оно даже будет работать, но ровно до тех пор пока в строке не появятся дополнительные параметры. Например пользователь перешел с внешнего ресурса и в URL была добавлена метка для Google Analitics, запрошенный URL получился примерно такой /news/445.php?utm_source=google. Вместо текста новости вы увидите сообщение «Элемент не найден», потому что в результате преобразования получился такой адрес /news/detail.php?ID=445?utm_source=google.
Ниже приведен код, решающий эту проблему:
Задача : Выполнить 301 редирект с одного домена на другой, чтобы любой адрес домена olddomain вёл на тот же адрес, но в домене newdomain.
Решение :
В файл .htaccess прописать правило:
Источник