Spiel Fragezeichen in mod_rewrite Regel regex
-
03-07-2019 - |
Frage
Ich suche Urls mit mehrere Teil neu zu schreiben. Eine Teilkette wird als ein Unterverzeichnis angefordert wird, während irgendwelche andere als normale Abfrage-String-Parameter angefordert werden.
Zum Beispiel würde Ich mag Urls umschreiben aus
http://www.mysite.com/mark/friends?page=2
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 super. Es scheint, wie das Problem, dass das ist ‚?‘ Charakter wird fälschlicherweise als Beginn eines neuen Query-String interpretiert.
Ich brauche auf alle Parameter zu übergeben, die nach / user / Freunde erscheinen, wie ist. Wie kann ich das erreichen?
Lösung
Sie sollten sein, den [QSA]
Flag verwendet anstatt zu versuchen, die Abfragezeichenfolge neu zu schreiben. [QSA]
geht auf dem Query-String an die URL neu geschrieben.
So Ihre Regel sollte wie folgt aussehen:
...
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L]
Ihr Fall ist sehr ähnlich wie Beispiel rel="nofollow für die Verwendung des QSA-Flag im mod_rewrite Kochbuch gegeben.
Andere Tipps
Die Abfrage ist Teil des URL-Pfades nicht und kann daher nicht sein mit der RewriteRule
Richtlinie verarbeitet. Dies kann nur mit der RewriteCond
Richtlinie (siehe %{QUERY_STRING}
erfolgen ).
Aber als Chad Birch sagte bereits es genügt th die QSA
Flagge automatisch das Original angefordert zu erhalten Abfrage auf die neue URL angehängt.
Zusätzlich zur Verwendung des Neuschreibmarkierungsregister QSA, 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 (wie angegeben):
http://www.example.com/friends.php?user=mark&page=2