2009-07-24 10 views
3

In meiner MVC-Anwendung verwende ich einen URI Router als bestimmt, welcher Controller und Aktion zu verwenden und erkennt GET-Parameter von der URI. Ich habe es geschrieben, so dass es diese beiden Formen annehmen:Rewriting Abfrage String mit mod_rewrite

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

Nun, was ich möchte tun Einsatz mod_rewrite die ?p=v Form an die /p/v Form umzuleiten (Argumentation rein kosmetischer Natur ist, GET Formulare die ?x=y Form). Ich bin völlig fest damit, wie ich das tun würde - ich habe eine Idee, die ich brauche ${QUERY_STRING}, aber ich bin mir nicht sicher, wie.

Antwort

2

Wenn Sie wirklich Umleitung von Anforderungen des Formulars wollen /controller/action?param1Name=param1Value zu /controller/action/param1Name/param1Value, versuchen Sie dies:

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

Aber wenn Sie auf entgegengesetzte Weise wollen:

RewriteRule ^([^/]+/[^/]+)/([^/]+)/([^/]+)(/.*) $1$4?$2=$3 [QSA] 
+0

Das ist ein paar verrückte Regex-Fu :) Es scheint aber nicht für mich arbeiten - die GET-Parameter in der URL bleiben so wie sie sind. – Ross

+0

@Ross: Ok, jetzt ist es getestet und es funktioniert für mich. – Gumbo

+0

Es möchte immer noch nicht auf meiner Plattform arbeiten, aber wenn es für Sie arbeitet, werde ich es als beantwortet markieren. Ich habe mich entschieden, wo ich ein Formular in einige Hyperlinks verwende). Danke – Ross

1

Wenn Sie es aus kosmetischen Gründen tun, möchten Sie vielleicht stattdessen einen POST durchführen, und dann werden die Abfrageparameter in der URL nicht angezeigt.

Wenn nicht - ich würde gerne die Antwort zu diesem selbst sehen!

+0

Wenn es dann nicht getan werden kann, Ja, ich nehme diesen Ansatz. Wäre immer noch nett, wenn es möglich ist. – Ross