X

mod_rewrite и слеш

Напоролся, на то, что при использовании, символа %2F в передаваемом url, mod_rewrite отказывался работать..
После долгих поисков нашел нужную инфу, оказывается у Apache есть директива, регулирующая этот вопрос - AllowEncodedSlashes. По-умолчанию, она отключена, т.е. использовать слеши в виде %2F и %5C не получится.
При включении её в On, слеши отлично передаются. Разумность отключения этой возможности мне так и не стала понятна.

Так же проблему может вызвать амперсанд, закодированный с помощью urlencode, разберемся подробнее:

1. Есть у нас такая переменная

    $a='A&B';

2. Нам необходимо передать её в URL, для этого мы готовим адрес

echo 'http://site.ru/?a='.urlencode($a).'&b=rand';

3. Вот так он будет выглядеть: http://site.ru/?a=A%26B&b=rand
4. На этом этапе все отлично, и даже будет работать, магия проявляется при использовании mod_rewrite. Пускай мы хотим сделать красивый URL, и преобразуем то, что есть у нас вот в такой url:

echo 'http://site.ru/'.urlencode($a).'-rand.html';

5. Получаем такой URL: http://site.ru/A%26B-rand.html
6. Пишем для него mod_rewrite правила

RewriteEngine On  
RewriteRule ^([^\/]+)-([^\/]+)\.html$ index.php?a=%1&b=%2  [L]

*замените %1,%2 на $1,$2

7. И оно у нас перестает работать! А почему? Дело в том, что правило работает правильно, но редирект получается у нас не верный, а именно:

index.php?a=A&B&b=rand

В итоге мы имеем уже не две переменные, а три. Весело? 🙂

8. Что же делать? В таком случае, необходимо, брать параметры из самого запроса, т.е. из {THE_REQUEST} для mod_rewrite. Применяя эти знания получаем:

RewriteCond %{THE_REQUEST} ^GET[\ ]+/(.+)/(.+)\.html[\ ]+HTTP.*$  
RewriteRule ^(.*)$ index.php?a=%1&b=%2 [L]

У меня все начало работать. Чего и Вам желаю 🙂

p.s. Если последнее правило у Вас не работает, проверьте как передает сервер эти знчения, таким образом:
mod_rewrite

RewriteCond %{THE_REQUEST} ^(.+)$  
RewriteRule ^(.*)$ index.php?test=%1[L]

index.php

<?php print_r($_REQUEST['test'];) ?>

и уже исходя из этих данных поправьте регулярку из пункта 8

Категории: Apache PHP Сервера