RewriteCond match query-string-Parameter in beliebiger Reihenfolge
Ich habe eine URL, die möglicherweise enthalten drei Parameter:
- ?Kategorie=Computer
- &Unterkategorie=laptops
- &product=dell-inspiron-15
Brauche ich eine 301-Weiterleitung von dieser URL auf seine freundliche version:
http://store.example.com/computers/laptops/dell-inspiron-15/
Habe ich diese aber nicht funktionieren, wenn die query-string-Parameter werden in anderer Reihenfolge:
RewriteCond %{QUERY_STRING} ^category=(\w+)&subcategory=(\w+)&product=(\w+) [NC]
RewriteRule ^index\.php$ http://store.example.com/%1/%2/%3/? [R,L]
Einfachste Lösung ist die PHP-tun umleiten.
das setzt Voraus, dass man mit PHP ... die Frage war spezifisch für apache, die verwendet werden könnten, mit einer beliebigen Anzahl von Sprachen/frameworks/etc. Stimmt, mit PHP (oder einer anderen Skript-oder Programmiersprache) zum Bearbeiten von URL-Parametern hat einige Vorteile, aber diese Frage war speziell zu apache/mod_rewrite.
In diesem konkreten Fall die OP zu sein schien mit Hilfe von PHP, wie die RewriteRule enthalten index.php.
das setzt Voraus, dass man mit PHP ... die Frage war spezifisch für apache, die verwendet werden könnten, mit einer beliebigen Anzahl von Sprachen/frameworks/etc. Stimmt, mit PHP (oder einer anderen Skript-oder Programmiersprache) zum Bearbeiten von URL-Parametern hat einige Vorteile, aber diese Frage war speziell zu apache/mod_rewrite.
In diesem konkreten Fall die OP zu sein schien mit Hilfe von PHP, wie die RewriteRule enthalten index.php.
InformationsquelleAutor TrueBlue | 2013-01-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erreichen dies mit mehreren Schritten, durch die Erkennung eines Parameters und dann die Weiterleitung zum nächsten Schritt und dann umleiten um das endgültige Ziel
Zu vermeiden, die
OR
und doppelte Bedingung, die Sie verwenden können,als @TrueBlue vorgeschlagen.
Ein weiterer Ansatz ist, um das Präfix der TestString
QUERY_STRING
mit einem kaufmännischen und-Zeichen&
, und überprüfen Sie immerDiese Technik (indem der TestString) können auch verwendet werden, um nach vorne tragen bereits gefundenen Parameter auf die nächste
RewriteCond
. Dies ermöglicht es uns vereinfachen, den drei Regeln, um nur einDen
!
wird hier nur verwendet, trennen Sie die bereits gefunden und neu geordnet Parameter aus derQUERY_STRING
./computers/
. Sollte nicht next-rule-check für/\w+/
statt index.php?Die erste Regel ändert sich die URL zu
index.php/computers
. So wird die nächste Regel überprüfen müssen, fürindex.php/...
. Ich befestigte das Muster zuindex.php/[^/]+
.Ich habe es auf Arbeit mit kleineren Verbesserungen (z.B.
(?:^|&)
zu beseitigen, die ODER-Klausel).Danke für das teilen Ihrer endgültigen Lösung.
Die Letzte Lösung scheint zu funktionieren nur, wenn alle Parameter in der Abfrage enthalten sind. Wenn einer fehlt, es scheint nicht zu funktionieren. Gibt es eine einfache Lösung für?
InformationsquelleAutor Olaf Dietsche
Nehme ich einen etwas anderen Ansatz für diese Art der Sache, Nutzung ENV-VARs setzen und Lesen von mod_rewrite. Ich finde es lesbarer /wartbarer zu finden, um die Rückverweise durch Namen wie diese, und diese ENV-VARs können später wiederverwendet werden in der request-Verarbeitung zu. Insgesamt denke ich, dass es ein mächtiger und flexibler Ansatz als die akzeptierte Antwort hier. In jedem Fall, es funktioniert gut für mich. Ich habe kopiert meine Kernaussage unten in seiner Gesamtheit:
Vom https://gist.github.com/cweekly/5ee064ddd551e1997d4c
P. S. Dies ist keine Kopie/pasteable Lösung auf deine Frage, sondern zeigt genau wie, um mit dieser Art problem umzugehen. Bewaffnet w dieses Verständnis, und nutzt es für dein Beispiel völlig trivial. 🙂
InformationsquelleAutor cweekly