Verwirrung hinsichtlich der Regelreihenfolge bei Apache mod_rewrite

Verwirrung hinsichtlich der Regelreihenfolge bei Apache mod_rewrite

Ich versuche, ein paar einfache Regeln einzurichten, die URLs einer alten Version einer Site basierend auf Teilen des Pfads und der Abfragezeichenfolge umschreiben.

Der erste Versuch sah so aus:

RewriteEngine on

RewriteMap freeitems txt:/www/www.example.com/etc/freeitems_map.txt
RewriteMap items txt:/www/www.example.com/etc/items_map.txt

RewriteCond %{QUERY_STRING} ^sku=(\d+)$
RewriteRule ^/free_item.php$ https://www.example.com/shop/detail/${freeitems:%1}?
RewriteRule ^/item.php$ https://www.example.com/shop/detail/${items:%1}?

Das schien für die /free_item.phpURLs gut zu funktionieren, da das Ergebnis aus dem korrekt ersetzt wurde RewriteMap, aber /item.phpURLs gaben nur den ersten Teil der umgeleiteten URL zurück und ließen die Ergebnisse aus der RewriteMapSuche aus. Wenn ich die Reihenfolge der Regeln umkehrte, kehrten sich die fehlgeschlagenen/funktionierenden URLs um. So wie ich RewriteRuledie Syntax immer verstanden habe, wird die Regel übersprungen und die Verarbeitung geht zur nächsten über, wenn der URL-Pfad nicht mit dem Muster übereinstimmt. In diesem Fall ist die

Ich habe es schließlich geschafft, es zum Laufen zu bringen, indem ich es in zwei Blöcke aufgeteilt habe:

RewriteEngine on

RewriteMap freeitems txt:/www/www.example.com/etc/freeitems_map.txt
RewriteMap items txt:/www/www.example.com/etc/items_map.txt

RewriteCond %{QUERY_STRING} ^sku=(\d+)$
RewriteRule ^/free_item.php$ https://www.example.com/shop/detail/${freeitems:%1}?

RewriteCond %{QUERY_STRING} ^sku=(\d+)$
RewriteRule ^/item.php$ https://www.example.com/shop/detail/${items:%1}?

Kann mich jemand aufklären, warum die erste Technik fehlgeschlagen ist?

BEARBEITEN:Als Test habe ich der umgeleiteten URL für die zweite Regel ein zusätzliches Pfadelement hinzugefügt RewriteRule. Als ich eine URL anforderte, die der zweiten Regel und nicht der ersten entsprechen sollte, wurde dieses Pfadelement wie erwartet angezeigt. Nur nicht das Ergebnis der RewriteMapSuche.

Danke!

-Ben

Antwort1

Der Grund, warum die erste Technik fehlschlug, ist, dass die Rückverweisfunktion RewriteCond %1 auf die zweite RewriteRule nicht existiert. Jede RewriteRule hat ihren eigenen Satz von RewriteCond und teilt RewriteCond nicht mit anderen RewriteRule-Blöcken.

Sehen:http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#InternalRuleset

Ich würde auch vorschlagen, das Flag [L] hinzuzufügen, da es so aussieht, als ob jede Regel für sich allein steht. Beispiel:

RewriteRule ^/free_item.php$ https://www.example.com/shop/detail/${freeitems:%1}? [L]

RewriteRule ^/item.php$ https://www.example.com/shop/detail/${items:%1}? [L]

Viel Glück :)

verwandte Informationen