Переписывание строки запроса с помощью mod_rewrite

В моем приложении MVC я использую маршрутизатор uri, который определяет, какой контроллер и действие использовать, и определяет параметры GET из uri. Я написал его так, чтобы он принимал обе эти формы:

http://localhost/controller/action/param1Name/param1Value
http://localhost/controller/action?param1Name=param1Value

Теперь я хотел бы использовать mod_rewrite для перенаправления формы ?p=v в форму /p/v (рассуждения чисто косметические, формы GET используют форму ?x=y). Однако я полностью застрял в том, как бы я это сделал - у меня есть идея, что мне нужно использовать ${QUERY_STRING}, но я не уверен, как это сделать.


person Ross    schedule 24.07.2009    source источник


Ответы (2)


Если вы действительно хотите перенаправить запросы вида /controller/action?param1Name=param1Value на /controller/action/param1Name/param1Value, попробуйте следующее:

RewriteCond %{THE_REQUEST} ^GET\ /[^/]+/[^/]+\?[^\s]+
RewriteCond %{QUERY_STRING} ^([^=&]+)=([^&]+)&?(.*)
RewriteRule ^[^/]+/[^/]+.* /$0/%1/%2?%3 [N]
RewriteCond %{THE_REQUEST} ^GET\ /[^/]+/[^/]+\?[^\s]+
RewriteRule ^[^/]+/[^/]+.* /$0 [L,R=301]

Но если вы хотите наоборот:

RewriteRule ^([^/]+/[^/]+)/([^/]+)/([^/]+)(/.*) $1$4?$2=$3 [QSA]
person Gumbo    schedule 24.07.2009
comment
Это какое-то сумасшедшее регулярное выражение :) У меня это, похоже, не работает - параметры GET в URL-адресе остаются такими, какие они есть. - person Ross; 25.07.2009
comment
Он по-прежнему не хочет работать на моей платформе, но если он работает для вас, я отмечу его как ответ. Я все равно решил изменить место, где я использую форму, на несколько гиперссылок). Спасибо - person Ross; 25.07.2009
comment
Возможно, вы захотите использовать функцию ведения журнала mod_rewrite, чтобы увидеть, где она ломается. См. http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteloglevel - person Gumbo; 25.07.2009

Если вы делаете это по косметическим причинам, вы можете вместо этого выполнить POST, и тогда параметры запроса не будут отображаться в URL-адресе.

Если нет - я хотел бы сам увидеть ответ на этот вопрос!

person Supertux    schedule 24.07.2009
comment
Если это невозможно сделать, то да, я приму этот подход. Хотя все равно было бы неплохо, если бы это было возможно. - person Ross; 25.07.2009