mod_rewrite и слеш
Напоролся, на то, что при использовании, символа %2F в передаваемом url, mod_rewrite отказывался работать..
После долгих поисков нашел нужную инфу, оказывается у Apache есть директива, регулирующая этот вопрос - AllowEncodedSlashes. По-умолчанию, она отключена, т.е. использовать слеши в виде %2F и %5C не получится.
При включении её в On, слеши отлично передаются. Разумность отключения этой возможности мне так и не стала понятна.
Так же проблему может вызвать амперсанд, закодированный с помощью urlencode, разберемся подробнее:
1. Есть у нас такая переменная
1 2 3 |
$a='A&B'; |
2. Нам необходимо передать её в URL, для этого мы готовим адрес
1 2 3 |
echo 'http://site.ru/?a='.urlencode($a).'&b=rand'; |
3. Вот так он будет выглядеть: http://site.ru/?a=A%26B&b=rand
4. На этом этапе все отлично, и даже будет работать, магия проявляется при использовании mod_rewrite. Пускай мы хотим сделать красивый URL, и преобразуем то, что есть у нас вот в такой url:
1 2 3 |
echo 'http://site.ru/'.urlencode($a).'-rand.html'; |
5. Получаем такой URL: http://site.ru/A%26B-rand.html
6. Пишем для него mod_rewrite правила
1 2 3 4 |
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. Применяя эти знания получаем:
1 2 3 4 |
RewriteCond %{THE_REQUEST} ^GET[\ ]+/(.+)/(.+)\.html[\ ]+HTTP.*$ RewriteRule ^(.*)$ index.php?a=%1&b=%2 [L] |
У меня все начало работать. Чего и Вам желаю 🙂
p.s. Если последнее правило у Вас не работает, проверьте как передает сервер эти знчения, таким образом:
mod_rewrite
1 2 3 4 |
RewriteCond %{THE_REQUEST} ^(.+)$ RewriteRule ^(.*)$ index.php?test=%1[L] |
index.php
1 2 3 |
<?php print_r($_REQUEST['test'];) ?> |
и уже исходя из этих данных поправьте регулярку из пункта 8
Author: | Tags: /
| Rating:
Leave a Reply