Bitrix и urlrewrite
- Главная
- >
- Статьи и переводы
- >
- Bitrix и urlrewrite
- >
Недавно потребовалось в интернет-магазине на Битриксе отображать урлы с русскими буквами, например, /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. И не забывайте хранить копию этого файла "в шаговой доступности" .