Probleme mit mod_rewrite



  • Hallo,

    Sorry für den nichtssagenden Thread-Titel, aber mir ist kein besserer eingefallen.

    Ich habe mir folgende .htaccess-Datei geschrieben:

    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    RewriteCond %{QUERY_STRING} ^tabid=73&productid=([0-9]+)$
    RewriteRule ^default\.aspx$ https://shop.example.com/default.aspx [R,L]
    
    RewriteCond %{QUERY_STRING} ^tabid=([0-9]+)$
    RewriteRule ^default\.aspx$ /tabid/%1/? [R,L]
    
    RewriteRule ^(.*)$ index.php?p=$1 [NC,L]
    

    bzw. um genau zu sein müssten die ersten drei und die letzte genau das sein, was Wordpress erzeugt, wenn man das auf "schöne" URLs umstellt.
    Alles bis auf die Zeilen 5 bis 9 funktioniert auch wunderbar. Wenn ich dann aber diese Zeilen hinzufüge, werden sämtliche Anfragen (insbesondere .css-Dateien, Bilder, ...) umgeleitet, d.h. sie enden mit einem 404.

    Weiß einer, warum die ersten beiden rewrite-conditions anscheinend nicht mehr greifen, wenn ich die Zeilen 5 bis 9 hinzufüge?



  • Manuelito schrieb:

    Weiß einer, warum die ersten beiden rewrite-conditions anscheinend nicht mehr greifen, wenn ich die Zeilen 5 bis 9 hinzufüge?

    Das steht in der Doku zu mod_rewrite. Kurz gesagt: Ein Block von RewriteCond-Zeilen gilt nur für die direkt danachfolgende RewriteRule.



  • Abgesehen von dem was ich oben geschrieben habe, ist diese Zeile nicht sehr robust:

    Manuelito schrieb:

    RewriteCond %{QUERY_STRING} ^tabid=73&productid=([0-9]+)$
    

    Die Reihenfolge der Variablen ist im Query-String nicht festgelegt, zumindest nicht, wenn deine Webseite keine URL-Normalisierung betreibt.

    Der Query-String kann dann genausogut productid=123&tabid=73 sein, oder sogar productid=123&weitere_variable=foo&tabid=73, falls noch andere Variablen vorkommen. Auf einen Query-String matchen mit regulären Ausdrücken ist recht fragil.



  • Hey Christoph,

    Vielen vielen Dank, genau das war das Problem.

    Christoph schrieb:

    Auf einen Query-String matchen mit regulären Ausdrücken ist recht fragil.

    Das ist in dem Fall egal. Hier geht es um den Umzug einer Seite und die beiden Parameter werden überall genau in der Reihenfolge und ohne einen weiteren Parameter dazwischen übergeben.

    Grüße,
    Manuel


Anmelden zum Antworten