Настройка ЧПУ, правило обработки адресов
Правильно ли я понимаю, что в процессе работы с Битрикс, иногда, генерируются разные дополнительные параметры, которые передаются в строке браузера для разных компонент, например, авторизации. В представленном выше правиле вырезаются только переменные ELEMENT_ID и SECTION_ID. А, остальные потеряются для дальнейшей обработки, когда сработает правило? Может быть будет лучше как-то усложнить Условие и Правило, чтобы остальные параметры тоже вырезались и передавались дальше?
Я имею ввиду, что если после /gospel/pericope/545/208/ будет какой-то хвост переменных /gospel/pericope/545/208/?abcd, то как лучше этот хвост выделить и пристыковать к /gospel/pericope/index.php?ELEMENT_ID=S1&SECTION_ID=S2, чтобы было /gospel/pericope/index.php?ELEMENT_ID=S1&SECTION_ID=S2&abcd ?
Подскажите, пожалуйста.
Задайте для хвоста регулярное выражение: Обработка адресов . Последний пример — как раз описанная Вами ситуация.
Спасибо, пример посмотрел.
По-моему там в примере обрезались знаки доллара и цифры после них, как и в сообщениях этого форума обрезаются (вместо доллара пишу S), поэтому там для меня не очень понятно, какие цифры ставить, когда скобки вложены друг в друга.
Понял, что нужно сделать вот такое правило.
Условие: #^/gospel/pericope/(1+)/(1+)/(\\?(.*))?# Компонент: ничего не писать Файл: /gospel/pericope/index.php Правило: ELEMENT_ID=S1&SECTION_ID=S2&S3
А обратную задачу как решить, подскажете?
/index.php?option=com_virtuemart&page=shop.browse&category_id=350& и далее разные параметры.
(обращения роботов по адресам от старой версии сайта )
редирект на /old/350/index.php
Условие: #^/index.php?option=com_virtuemart&page=shop.browse&category_id=(1+)#
Компонент:
Файл: /old/
Правило: $1/index.php
Что-то не нравятся мне вложенные скобки и двойной слеш в примере, пожалуй, переделаю по-другому
Условие: #^/gospel/pericope/(5+)/(9+)/ (\\?(.*)) ?#
Так, наверное, лучше будет:
#^/gospel/pericope/(3+)/(3+)/\?(.*)?#
Алексей, для такого правила вам не нужно ничего добавлять, все параметры и так придут.
Т.е.: #^/gospel/pericope/(4+)/(4+)/#
вполне достаточно
А вот если у вас ссылка такого шаблона /gospel/pericope/(8+)/(1+).php
тогда вот такое правило должно быть:
#^/gospel/pericope/(7+)/(5+)\.php.*#
Или я не совсем понял вашу проблему?
Цитата |
---|
Sergey Leshchenko пишет: Алексей, для такого правила вам не нужно ничего добавлять, все параметры и так прийдут. Т.е.: #^/gospel/pericope/(8+)/(4+)/# вполне достаточно |
Я так понимаю, что им неоткуда прийти, если они не выделены в скобках и не пристыкованы через $3.
Если я оставляю правило так: #^/gospel/pericope/(4+)/(2+)/#, а потом администратором зайду на страницу /gospel/pericope/545/208/, мне будет показана страница /gospel/pericope/?ELEMENT_ID=545&SECTION_ID=208, т.к. правило сработает.
Но, если я, например, что-нибудь исправлю на странице и нажму кнопку Обновить кеш, то браузер отправит страницу с параметром /gospel/pericope/545/208/?clear_cache=Y, что вызывает ошибку (не найден раздел), я подозреваю, что из-за того, что ?clear_cache=Y теряется при формировании /gospel/pericope/?ELEMENT_ID=545&SECTION_ID=208&clear_cache=Y.
Поэтому, я добавил последнюю третью скобку, чтобы все изначальные параметры не терять, а пристыковать в конце к ELEMENT_ID=545&SECTION_ID=208.
Цитата |
---|
Алексей Комаров пишет: Я так понимаю, что им неоткуда прийти, если они не выделены в скобках и не пристыкованы через $3. |
Почему? Апач увидит тот REQUEST_URI, который его запросили и разберет его, он ничего не знает про ваше ЧПУ. Затем система urlrewrite битрикса разберет ваше правило, добавит в суперглобальные переменные ЧПУ-параметры и подправит $_SERVER[‘QUERY_STRING’].
Для проверки на вашей ЧПУ-странице с обычным правилом сделайте echo ‘
'.print_r(array($_REQUEST, $_SERVER), true).'
‘;
добавляйте какие хотите дополнительные параметры — они все будут.
P.S. А ошибку вызывает что-то другое.
Ошибка, вроде ушла, когда я второй подряд ? добавил, т.е. сделалал первый ? необязательным, пока так оставляю:
#^/gospel/pericope/(4+)/(9+)/\??(.*)?#
Цитата |
---|
Sergey Leshchenko пишет: Для проверки на вашей ЧПУ-странице с обычным правилом сделайте echo ‘ '.print_r(array($_REQUEST, $_SERVER), true).' ‘; добавляйте какие хотите дополнительные параметры — они все будут. |
echo ''.print_r(array($_REQUEST, $_SERVER), true).'';
Если дополнительных параметров в строке браузера нет, то все правила срабатывают одинаково, но если дополнительный параметр есть, то нужно использовать второе правило, т.к. первое не выделяет номер раздела.
Результаты после первого правила
Цитата |
---|
Условие: #^/gospel/synopsis/infogram/(5+)/(6+)/# Файл: /gospel/synopsis/infogram/index.php Правило: ELEMENT_ID=$1&SECTION_ID=$2 |
Результат, в сокращении, на строку в браузере (когда будет ошибочный SECTION_ID): …/gospel/synopsis/infogram/493/141/?clear_cache=Y
Цитата |
---|
Условие: #^/gospel/synopsis/infogram/(6+)/(7+)/.*# Файл: /gospel/synopsis/infogram/index.php Правило: ELEMENT_ID=$1&SECTION_ID=$2 |
Результат, в сокращении, на строку в браузере (правильный SECTION_ID): …/gospel/synopsis/infogram/493/141/?clear_cache=Y
Цитата |
---|
Array ( [0] => Array ( [clear_cache] => Y [ELEMENT_ID] => 493 [SECTION_ID] => 141 ) [1] => Array ( [REDIRECT_QUERY_STRING] => clear_cache=Y [REDIRECT_URL] => /gospel/synopsis/infogram/493/141/ [QUERY_STRING] => ELEMENT_ID=493&SECTION_ID=141 [REQUEST_URI] => /gospel/synopsis/infogram/493/141/?clear_cache=Y [SCRIPT_NAME] => /bitrix/urlrewrite.php [PHP_SELF] => /bitrix/urlrewrite.php [argv] => Array ( [0] => clear_cache=Y ) [argc] => 1 [REAL_FILE_PATH] => /gospel/synopsis/infogram/index.php )) |
Условие: #^/ido/kurs/(4+)/# Файл: /ido/kurs/detail.php Правило: >
Все работает. Ровно до того момента, как в адресе появляется что-то типа ?clear_cache=Y или ?sphrase_id=37998
Как изменить правило?
Думаю, надо добавить в конец условия .*
Условие: #^/ido/kurs/(5+)/.*#
Тогда, ID вырежется точно, но, я не знаю, потеряются ли дополнительные параметры clear_cache или sphrase_i. В моём втором примере выше дополнительные параметры есть (и у Вас будут, наверное) в
Array ( [0] => Array (
[clear_cache] => Y
[REDIRECT_QUERY_STRING] => clear_cache=Y
[argv] => Array ( [0] => clear_cache=Y )
Но, как они дальше отрабатываются или же теряются мне не понятно.
А, вспомнил про этот косяк с дописыванием ‘?’ в preg_replace() modules/main/include/urlrewrite.php
И в ТП тикет создал (#61636) по этому поводу, два с половиной года тому назад.
Мне ответили:
Цитата |
---|
Если исправление необходимо и возможно — оно будет выпущено в одном из обновлений главного модуля. |
Значит нет необходимости или еще очередь не дошла
Цитата |
---|
Sergey Leshchenko пишет: Да, нужно всегда добавлять .* в конец условия если правило (RULE) задано. И тогда будет все ок. |
Чтобы понять как нужно писать правило ЧПУ, рассматривал, как образец, уже созданные автоматически БУСом правила, например комплексным компонентом форум или faq, есть в демонстрационной версии. Так вот, компонентом создаётся обычное правило без .* в конце. У этих автоматически созданных битрисовкских правил не задано правил, использующих (через $1, $2. ) вырезающие из условия дополнительные группировки в скобках.
Получается, что до этого .* в конце условия нужно самим доходить опытным экспериментальным путём, потому что на мой взгляд это избыточные символы в условии, но без них, ведь, не работает, когда есть в строке дополнительные параметры. И, не написано об этом в руководстве по ссылке, приведённой в теме выше, хотя получить SECTION_ID или ELEMENT_ID из строки при настройке ЧПУ — это типовая операция, если переходить на ЧПУ от динамических адресов. Странно как-то, сидеть пользователю и экспериментировать с ЧПУ и регулярными выражениями, чтобы понять как это нужно вписать в Битрикс.
Как сделать, чтобы news.detail понимал, что это за элемент?
Создаю страницу детального просмотра через detail.php.
detail.php вызываю через urlrewrite.php
Надо как-то передавать данные элемента инфоблока, чтобы компонент news.detail понимал, что это за элемент
Заранее спасибо.
IncludeComponent( "site:news.detail", "decision", Array( "ACTIVE_DATE_FORMAT" => "d.m.Y", "ADD_ELEMENT_CHAIN" => "N", "ADD_SECTIONS_CHAIN" => "Y", "AJAX_MODE" => "N", "AJAX_OPTION_ADDITIONAL" => "", "AJAX_OPTION_HISTORY" => "N", "AJAX_OPTION_JUMP" => "N", "AJAX_OPTION_STYLE" => "Y", "BROWSER_TITLE" => "-", "CACHE_GROUPS" => "Y", "CACHE_TIME" => "36000000", "CACHE_TYPE" => "A", "CHECK_DATES" => "Y", "DETAIL_URL" => "", "DISPLAY_BOTTOM_PAGER" => "Y", "DISPLAY_DATE" => "Y", "DISPLAY_NAME" => "Y", "DISPLAY_PICTURE" => "Y", "DISPLAY_PREVIEW_TEXT" => "Y", "DISPLAY_TOP_PAGER" => "N", "ELEMENT_CODE" => "", "ELEMENT_ID" => "", "FIELD_CODE" => array("",""), "IBLOCK_ID" => "13", "IBLOCK_TYPE" => "content", "IBLOCK_URL" => "", "INCLUDE_IBLOCK_INTO_CHAIN" => "Y", "MESSAGE_404" => "", "META_DESCRIPTION" => "-", "META_KEYWORDS" => "-", "PAGER_BASE_LINK_ENABLE" => "N", "PAGER_SHOW_ALL" => "N", "PAGER_TEMPLATE" => ".default", "PAGER_TITLE" => "Страница", "PROPERTY_CODE" => array("",""), "SET_BROWSER_TITLE" => "Y", "SET_CANONICAL_URL" => "N", "SET_LAST_MODIFIED" => "N", "SET_META_DESCRIPTION" => "Y", "SET_META_KEYWORDS" => "Y", "SET_STATUS_404" => "N", "SET_TITLE" => "Y", "SHOW_404" => "N", "STRICT_SECTION_CHECK" => "N", "USE_PERMISSIONS" => "N", "USE_SHARE" => "N" ) );?>
Настройки инфоблока:
array ( 'CONDITION' => '#^/about/([0-9a-zA-Z_-]+)/.*#', 'RULE' => '', 'ID' => 'site:news', 'PATH' => '/about/detail.php', 'SORT' => 100, ), );
yunaliev.ru
Программирование, как и искусство — одно слово, за которым скрывается бесконечное множество занятий 😉
Битрикс ЧПУ, правила urlrewrite.php
Самые часто используемые правила ЧПУ в битриксе это страницы детального описания элемента, например /section/125/ 125 это ID элемента, в основном это дополнительные разделы сайта, для магазинов используется комплексный компонент каталога и там 1 правило для всего компонента, но речь не о ней.
Для таких страницы правило выглядет так.
Если 1 числовой идентификатор:
array( "CONDITION" => "#^/section/(9+)/#", "RULE" => "ELEMENT_ID=\$1", "ID" => "", "PATH" => "/section/detail.php", )
Если символьный идентификатор:
array( "CONDITION" => "#^/section/([A-z]+)/#", "RULE" => "ELEMENT_CODE=\$1", "ID" => "", "PATH" => "/section/detail.php", )
Если смешанный, состоящий как из цифр так и из символов:
array( "CONDITION" => "#^/section/[A-z-0-9]+)/#", "RULE" => "ELEMENT_CODE=\$1", "ID" => "", "PATH" => "/section/detail.php", )
Но зачастую, особенно новички оставляют эти правильно как показано в примере, но если мы к этом адресу добавим параметры, то идентификатор ломается
в массиве $_GET вы получите не ELEMENT_ID = 125, а ELEMENT_ID = 125/?param=1, решением может быть функция intval($_GET[‘ELEMENT_ID’]), но правильным решением будет добавить в правило условие (\\?(.*))?#
В итоге, для простых страниц с ЧПУ нужно использовать правило:
array( "CONDITION" => "#^/section/(8+)/(\\?(.*))?#", "RULE" => "ELEMENT_ID=\$1", "ID" => "", "PATH" => "/section/detail.php", )