Секретные записки WEB-программиста




100mbru, bitrix, CentOS, cms, drupal, java, joomla, LAMP, linux, mysql, nicru, Open-Source, php, Red Hat, seo, Typo3, ubuntu, win, windows, авто, администрирование, алгоритмы, алкоголь, бизнес, битрикс, видео, военмех, выборы, германия, джино, домены, интересности, исследования, картинки, кино, компьютеры, ливия, магазин, маразм, мастерхост, обработка-изображений, пейнтбол, политика, политэкономия, прикольное-видео, программирование, путешествия, работа, религия, рунет, сайтостроение, сео, сми, технологии, украина, форум, хиханьки, холивары, хостинг

Bitrix и urlrewrite

10.04.2017

Недавно потребовалось в интернет-магазине на Битриксе отображать урлы с русскими буквами, например, /catalog/Коллекция_Collection-Name
Для этого пришлось подредактировать файл urlrewrite.php и добавить следующее правило:

  "CONDITION"  =>  "#^/catalog/([a-zA-Z0-9а-яёА-ЯЁ_-]+)$#"  , 
 "RULE"  =>  "SECTION_CODE= $1 "  , 
 "PATH"  =>  "/store/collection.php"  , 

Казалось бы, это все. Но нет. Так как сайт работал в кодировке utf-8, то Битрикс нагло игнорировал "узнавание" русских букв. Данная проблема (как и в большинстве случаев) решается установкой флага u . В итоге, правило приобретает такой вид:

  "CONDITION"  =>  "#^/catalog/([a-zA-Z0-9а-яёА-ЯЁ_-]+)$#u"  , 
 "RULE"  =>  "SECTION_CODE= $1 "  , 
 "PATH"  =>  "/store/collection.php"  , 

Теперь Битрикс работает как надо.

Еще немного трюков:
1. Редирект с множества вариантов урлов:

  "CONDITION"  =>  "#^/(service|shops|contacts|warranty|rules) $#" , 
 "RULE"  =>  "v=1"  , // чит, чтобы заставить PATH воспринимать регулярное выражение 
 "PATH"  =>  "  /info/$1/index.php " , 

Таким образом ссылки /service, /shops, /contacts, /warranty, /rules будут вести на соответствующие индексные файлы в подкаталогах каталога /info .

2. Учет дополнительных параметров в урлах
Если Ваша схема урлов довольно чувствительна к передаваемым параметрам, например:

  "CONDITION"  =>  "#^/catalog/([a-zA-Z0-9а-яёА-ЯЁ_-]+)$#"  , 
 "RULE"  =>  "SECTION_CODE= $1 "  , 
 "PATH"  =>  "/store/collection.php"  , 

То попытка перейти по ссылке /catalog/Коллекция_Collection-Name?clear_cache=Y вызовет у Битрикса когнитивный диссонанс и как результат 404-ю ошибку. Чтобы он воспринимал такие урлы правильно, делаем так:

  "CONDITION"  =>  "#^/catalog/([a-zA-Z0-9а-яёА-ЯЁ_-]+)(.*)$#"  , 
 "RULE"  =>  "SECTION_CODE= $1 &$2"  , 
 "PATH"  =>  "/store/collection.php"  , 

Теперь Битрикс адекватно воспринимает все передаваемые GET-параметры и без проблем обновляет кеш.


3. Совершенно феерический номер - обработка урлов со слешами. Например: /catalog/Коллекция_S/S-2013
Одно из решений следующее: перед выводом урла в страницу кодируем его urlencode . При этом слеши будут заменены на выражение %2F. Теперь заменяем обычным str_replace %2F на %252F. Rewrite-правило принимает такой вид:

  "CONDITION"  =>  "#^/catalog/([a-zA-Z0-9а-яёА-ЯЁ_(%2F)-]+)$#u"  , 
 "RULE"  =>  "SECTION_CODE= $1 "  , 
 "PATH"  =>  "/store/collection.php"  , 

Теперь в скрипт обработки передается значение SECTION_CODE равное "Коллекция_S/S-2013".

Ну и финальный совет: сам битрикс очень любит перекроить файл urlrewrite.php так как хочется ему при любой удобной возможности.
Если в ваших настройках реврайтов очень важен порядок и вы не желаете неожиданных изменений, то можно поставить файлу urlrewrite.php права только на чтение - 0444 или совсем строго - только на чтение владельцу - 0400. И не забывайте хранить копию этого файла "в шаговой доступности" .