2009-05-04 11 views
20

Ich suche nach URLs mit mehreren Teilstrings neu schreiben. Eine Teilzeichenfolge wird als Unterverzeichnis angefordert, während alle anderen Zeichenfolgen als normale Abfragezeichenfolgenparameter angefordert werden.Übereinstimmung Fragezeichen in mod_rewrite Regel Regex

Zum Beispiel würde Ich mag Urls umschreiben von

http://www.mysite.com/mark/friends?page=2 

zu

http://www.mysite.com/friends.php?user=mark&page=2 

Ich bin der Lage, dies mit Ausnahme der Fragezeichen Charakter zu erreichen. Hier ist meine Rewrite-Regel:

... 
RewriteEngine On 
RewriteBase/
RewriteRule ^([A-Za-z0-9-_]+)/friends[?]?([^/\.]+)?$ friends.php?user=$1&$2 [L] 

Wenn ich das Fragezeichen zu jedem anderen Charakter ändere es funktioniert gut. Es scheint, als wäre das Problem, dass das "?" Das Zeichen wird fälschlicherweise als Start einer neuen Abfragezeichenfolge interpretiert.

Ich muss alle Parameter übergeben, die nach/user/friends wie angezeigt werden. Wie erreiche ich das?

Antwort

33

Sie sollten das Flag [QSA] verwenden, anstatt zu versuchen, die Abfragezeichenfolge neu zu schreiben. übergibt die Abfragezeichenfolge an die umgeschriebene URL.

So sollte die Regel wie folgt aussehen:

... 
RewriteEngine On 
RewriteBase/
RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L] 

Ihr Fall zu the example given for using the QSA flag in the mod_rewrite cookbook sehr ähnlich ist.

+0

Danke für die Antwort. Funktioniert wirklich gut und ich lese gerade das Kochbuch. – markb

+0

Supers Lösung es funktioniert auch für mich, obwohl ich Code zu meinen Bedingungen bearbeitet: RewriteRule^([A-Za-z0-9 -_] +) \. Php? pindex.php? typeofpage = $ 1 [QSA, L] –

10

Die query is not part of the URL path and thus cannot be processed with the RewriteRule directive. Dies ist nur mit der RewriteCond Direktive möglich (siehe %{QUERY_STRING}).

Aber as Chad Birch already said reicht es aus, die QSA flag automatisch die ursprüngliche angeforderte Abfrage an die neue URL angehängt zu bekommen.

+0

QSA hat ein Problem aufgelistet unter https://stackoverflow.com/questions/16468098/what-is-l-in-qsa-l-in-htaccess/16468677#comment79837245_16468677 . Rewritecond query_string ist auch nicht in der Lage, Anforderungen mit keinen Abfragezeichenfolgen zu unterscheiden, gegenüber Anfragen mit nackten Abfragezeichenfolgen (dh ein einzelnes Fragezeichen und sonst nichts). Gibt es eine Möglichkeit, diese beiden Anfragen zu unterscheiden? – Pacerier

+0

Ok nbm .. Ich habe es gefunden: '$ {the_request}' – Pacerier

1

Neben der Neuschreibmarkierungsregister QSA verwenden, können Sie auch die Umgebungsvariable QUERY_STRING verwenden, wie unten dargestellt:

RewriteEngine On 
RewriteBase/
RewriteRule ^([A-Za-z0-9-_]+)/friends$ /friends.php?user=$1&%{QUERY_STRING} 

und die URL in Frage

http://www.example.com/mark/friends?page=2 

wird neu geschrieben werden (wie angegeben):

http://www.example.com/friends.php?user=mark&page=2 
+0

Cool, '% {QUERY_STRING}' funktioniert. – Pacerier

Verwandte Themen