dedlfix: mod_rewrite

Beitrag lesen

Tach!

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 :(

Der Log-Zugriff ist das Problem, denn mit den Rewrite-Logs kann man sehr genau sehen, was da im inneren passiert. Wenn du beim Hoster kein RewriteLog anlegen kannst (geht nur als Admin), dann kannst du immer noch zu Hause ein gleichwertiges System aufzusetzen versuchen.

Eine zutreffende Regel erzeugt einen neuen internen Request. Dieser hält sich seinerseits an die für ihn zutreffende Konfiguration. Wenn da also auch wieder Rewrite-Regeln stehen - besonders wenn der interne Request in daselbe Verzeichnis ging - dann werden diese eben nochmals anzuwenden versucht.

In welche Dokumentation soll ich schauen. Es gibt 2.0, 2.2, 2.4. Bei mir steht in %{API_VERSION} "20051115:3". In $_SERVER["SERVER_SOFTWARE"] steht leider nur "Apache", ohne Version.

Frag deinen Hoster. Manchmal findet man die Version in den HTTP-Response-Headern. Notfalls nimmst du eben nur die Features von Version 2.0 und schaust im Zweifelsfall ín die Doku der neueren Versione, ob sich da was geändert hat, an dem Feature, das du verwenden willst. Viel ist es in der Regel nicht, es kommt eher nur Neues hinzu.

[code lang=css]

Apache-Konfiguration ist kein CSS. Nimm bitte die Sprache "apache", wenn du dessen Regeln für dieses Forum auszeichnen möchtest.

RewriteCond %{HTTP_HOST} [^route].*.example.de$ [NC]

[] ist eine Zeichenklasse. Das heißt, ein Zeichen daraus muss es sein (oder auch nicht, bei Negation). Diese Regel matcht also bei:

ein Zeichen, das kein r, o, u, t oder e ist
  gefolgt von einem beliebigen Zeichen und das beliebig oft
  gefolgt von einem beliebigen Zeichen
  example
  noch einem beliebigen Zeichen
  de
  sowie dem Ende

Die Regel passt also auf alle möglichen Anfänge, die nicht mit r, o, u, t oder e anfangen. Wenn du testest, muss du nciht nur deine Anwendungsfälle probieren sondern mindestens exemplarisch auch ein paar Fälle, die nicht treffen sollen. Sei dabei kreativ und versuch das von dir ausgedachte System zu Fall zu bringen. Wenn du es nicht machst, ein anderer macht es garantiert.

Maschinen sind dumm. Die können nicht wissen, wann du den Punkt meinst und wann du ein beliebiges Zeichen meinst. Da der Punkt eine Sonderbedeutung hat, musst du ihn maskieren, wenn er für sich selbst stehen soll.

Wie kann ich erreichen, dass in der Referenz der letzten RewriteRule $1 auch der Slash gespeichert wird?

Vielleicht lässt sich eine komplexe/komplizierte Regel finden, die das Slash-Problem löst. Ich würde mich aber nicht auf die Suche danach begeben, sondern die Rewrite-Regel so simpel wie möglich schreiben, dass einfach nur ein PHP-Script aufgerufen wird, ohne weitere Parameter. Im Script kannst du dann nach Herzenslust $_SERVER['REQUEST_URI') auseinandernehmen und auswerten. (Oder auch was anderes. Schau einfach nach, was da in $_SERVER alles verwendbares drinsteht.)

Ich möchte diese Regel "intern" anwenden. Heisst: im Browser soll stehen www.example.com/page. Daher verwende ich Flag P. Mache ich das richtig?

Nein. P steht für Proxy, nicht für intern. Intern passiert sowieso alles, wenn du es nicht explizit zu einem Redirect schickst. Ich dachte, du liest die Dokumentation, denn dann hättest du eigentlich gesehen, dass da was mit mod_proxy steht, woraufhin dir auffallen müsste, dass du damit ja gar nicht arbeitest.

dedlfix.