0

Проблема с неоднозначным mod_rewrite

Столкнулся с проблемой. На моём локальном apache правило mod_rewrite работает нормально, как и ожидается. А вот у хостера, как на зло, — нет. И вроде бы всё одно и тоже, а результат разный.

Поясню проблему. Допустим нам нужно перейти по такому url:

http://site.ru/search/search string/

Допустим, мы используем следующее mor_rewrite правило:

RewriteRule ^search/([^/]+)/?$ /?page=search&search_string=$1 [L,QSA]

Вроде бы, всё должно работать. Оно и работает. На одних серверах, а на других — нет (как у моего хостера). У меня:

$_GET[search_string] == "search string";

Как и ожидалось. А на удалённом сервере:

$_GET[search_string] == "search";

То есть отбрасывается часть после пробела. Из двух слов мы получаем только одно.

Проблема, похоже в том, что прежде чем попасть к mod_rewrite строка url подвергается преобразованию. И как результат преобразования всё что после пробела теряется.

Обходится это анализом самой строки запроса. Хорошо, что это можно сделать правилами mod_rewrite и не строить дополнительных костылей:

RewriteCond %{THE_REQUEST} ^GET[\ ]+/search/([^/]+)/?[\ ]+HTTP.*$
RewriteRule ^(.*)$ index.php?page=search&search_string=%1 [L,QSA]

Обратите внимание, что переменные начинаются не со знака доллара «$», а со знака процента «%». С таким правилом всё работает даже на удалённом сервере.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *