Перейти к содержимому



Mod_rewrite, или спецсимволы в URL

#1 EugeneM

EugeneM
  • Пользователь
  • 20 сообщений
  • Репутация: 0
0

Отправлено 05 Ноябрь 2010 - 02:00

Помогите победить такую штуку.

Нужно реализовать поиск по сайту. Самое главное - строка-запрос должна присутствовать в URL с результатом поиска. Например, ищем "слово1", а страница с результатом будет иметь URL http://hostname.ru/search/слово1.

Сделал. Работает. Но если руками в адресной строке браузера написать
http://hostname.ru/search/%
то он ругается, что "Bad Request"

В .htaccess при этом указано
RewriteRule ^search\/(.*)\/?$ index.php?act=search&txt=$1
Пробовал переписать как
RewriteRule ^search\/([^/]+)\/?$ index.php?act=search&txt=$1
и результат тот же самый.

Ну не любит он этот знак процента!
Если этот % ввести в форме поиска на странице, то он уже передается как
http://hostname.ru/search/%25
и все обрабатывается как и положено. Но хотелось бы, чтобы и если просто в адресе этот % поставить, то ошибки не возникало...

Это как-то можно победить?

 

 

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Mod_rewrite
  2. Как работает mod_rewrite
  3. Неправильно работают свои правила mod_rewrite
  4. Помогите с mod_rewrite
  5. Пытаюсь составить правило для mod_rewrite.

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 07 Ноябрь 2010 - 01:48

EugeneM, сколько попробовал, ничего не работает. Все варианты что есть в интернете:
http://www.sitepoint...ad.php?t=143541
http://stackoverflow...ercent-from-url

Хотя на официальном сайте Apache.org в наличии флаг B:

'B' (escape backreferences)

Apache has to unescape URLs before mapping them, so backreferences will be unescaped at the time they are applied. Using the B flag, non-alphanumeric characters in backreferences will be escaped. For example, consider the rule:

RewriteRule ^(.*)$ index.php?show=$1

This will map /C++ to index.php?show=/C++. But it will also map /C%2b%2b to index.php?show=/C++, because the %2b has been unescaped. With the B flag, it will instead map to index.php?show=/C%2b%2b.

This escaping is particularly necessary in a proxy situation, when the backend may break if presented with an unescaped URL.

Пробовал данный флаг - с используемыми в адресной строке спецсимволами + (обозначают пробел). Всё сработало, строка вывелась.
Но с процентом всё не так просто - сервер никак не хочет понимать, что мы хотим % использовать как символ, а не как предваряющий спецсимвол 16-ричного представления какого-либо символа.
Как от этого избавиться, честно сказать, не знаю. Даже в Wiki его не используют - http://www.wikipedia.org/%
  • 0


Оформление форума – IPBSkins.ru