Moin!
Mod_rewrite kann einen ja ganz schön in Bedrängnis bringen. Ich denke der Hauptgrund ist, dass man nicht genau sehen oder verfolgen kann, was da eigentlich passiert. Die Regeln werden ja mehrmals durchlaufen und man sieht nicht, wie oft, mit welchen Werten für die Referenzen, etc. Ich habe keinen Zugriff auf die logs :(
Ich würde versuchen zu vermeiden, in solch einer Situation intensiver mit Rewriting zu arbeiten, sondern wenn dann alle Logik in die Applikation hinein tun.
Sprich: Rewriting sorgt dafür, dass faktisch alle URLs auf ein Skript laufen (idealerweise dasselbe für alle), welches dann in genehmerer Programmiersprache und Debuggbarkeit den Request auseinandernimmt.
Das betrifft insbesondere auch den Versuch, die diversen Pfadbestandteile einer URL schon im Rewriting in den Query-String zu drücken. Das ist im Prinzip vollkommen überflüssig, sogar schwierig zu debuggen und zu pflegen, denn die Logik der Analyse der URL teilt sich jetzt unschön auf: Der Browser und die Wahrnehmung der URL sehen nur den kompletten Pfad ohne Parameter, und die Skripte sehen nur die umgeschriebene URL als Parametersammlung. Und haben dann aber wieder die Aufgabe, neue URLs zu bilden, die eben gerade diese Parameter NICHT enthalten. Gerade dafür fehlt aber die Softwarekomponente, denn für "Rewriting rückwärts" gibts beim Apachen nix.
Mein Vorschschlag deshalb: Pauschales Rewriting einfach auf ein Skript, egal was in der URL stand. Das Skript kann dann ganz in Ruhe die URL analysieren und passend reagieren:
* Stimmt die Domain nicht? Redirect ausspucken.
* Ist am Ende ein Slash zuviel? Kann man doch ignorieren oder abschneiden (finde ich nämlich nicht dramatisch), im Zweifel halt auch redirecten. Wobei ich die Frage stelle, wie es zu solchen URLs kommen kann. Wenn die falsch sind, wäre 404 nämlich auch eine korrekte Antwort.
* Und wenn sonst alles schön ist, kann man den Pfad des Requests jetzt passend nach Werten durchschauen, die man im Skript verwenden will.
Sowas bieten übrigens alle nennenswerten MVC-Frameworks von sich aus schon an. Das Rewriting z.B. für das Zend Framework ist genau das, was ich vorschlage: Ein einzelnes Rewrite auf das Skript, es sei denn (der Test erfolgt vorher), dass die URL eine existierende Datei als Ressource trifft (also Bilder etc.). Nur in so einer Situation hat die Applikation die volle Kontrolle über die URL und kann in fast beliebiger Weise auf Requests reagieren. Und das insbesondere in der Sprache der Applikation - also der Sprache, die der Programmierer in der Regel beherrscht.
- Sven Rautenberg