Sven Rautenberg: mod_Rewrite übertirfft alle ?

Beitrag lesen

Moin!

mod_rewrite kann hier irgendwie keiner richtig klar machen.

Es gibt reichhaltige Beispielkonfigurationen und eine recht umfangreiche Dokumentation zu mod_rewrite, alles auf dem Apache-Server.

Außerdem gibts Google, welches, befragt nach "mod_rewrite deutsch" unter anderem folgende URL ausspuckte: http://www.heise.de/ix/artikel/1996/12/149/. Ein Artikel aus dem Jahre 1996 über mod_rewrite, mitgeschrieben von Ralf S. Engelschall, dem (Mit-?)Autoren von mod_rewrite.

Selber lesen und probieren macht auch schlau. Vielleicht solltest du dein Augenmerk auch mal auf die Log-Möglichkeiten legen. RewriteLog unr RewriteLogLevel sind dafür geeignet.

stellt euch vor:
im verzeichniss .../user/ ist eine htaccess und eine htpsswd.
jeder der darauf zugreifen will wird nach username und passwort abgefragt (wie hier[link http://www.plascha.de/djwoelk/login/]).

der user "user3" möchte sich in [link http://www.plascha.de/djwoelk/login/] einloggen.
hat er das erfolgreich gemacht, so wird sie in das verzeichniss meiner wahl umgeleitet:

  • require user susi - in - http://www.plascha.de/djwoelk/susi
  • require user gabi - in - http://www.plascha.de/djwoelk/user2
  • require user user3 - in - http://www.plascha.de/djwoelk/user3
  • require user user4 - in - http://www.plascha.de/djwoelk/egal

wie geht das ? Das problem ist doch jetzt so deutlich wies nur geht.

In der Tat ist das deutlich. Das Problem ist: Das klappt so schon aus anderen Gründen nicht, nämlich wegen dem Geltungsbereich des Paßwortes.

Du mußt ja, um einigermaßen Sicherheit zu haben, jedes Userverzeichnis so schützen, daß nur der jeweilige Benutzer Zugriff hat. Nach meiner Ansicht funktioniert das aber nur, wenn du den Zugriff nach und nach filterst. Also so:

/login/       <- Hier kommt man nur mit Paßwort rein.
/login/user1/ <- Hier kommt nur ein User rein.
/login/user2/ <- Hier kommt nur ein anderer User rein.

Wenn du die Verzeichnisse so strukturierst, dann gilt die Login-Eingabe in /login/ auch noch für die Unterverzeichnisse (wird vom Browser automatisch mitgeschickt) - dort kannst du unpassende Benutzer aber durch schärfere "require user"-Regeln aussperren. Für /login/ dürfen eben alle User, in die Unterverzeichnisse darf jeweils nur einer. Dazu brauchst du nur eine .htaccess-Datei in jedem Unterverzeichnis mit den identischen Angaben wie in /login/ - einziger Unterschied sind weniger "require user". Die Paßwortdatei wird nicht verdoppelt.

So, und jetzt ist die Frage: Wie kriegt man da jetzt mod_rewrite unter? Gehen wir doch mal gedanklich durch:

1. Jemand klickt auf einen "Login"-Link oder ruft /login/ aus den Bookmarks auf.

2. Dadurch kriegt er erst einmal den Login-Schirm durch den Browser vorgesetzt, weil der Server mit Statuscode 401 antwortet.

3. Wenn er richtig antwortet, kriegt er die Index-Datei, die sich in /login/ befindet, regulär ausgeliefert (200 OK).

Was soll passieren? Soll er die Index-Datei aus /login/ kriegen, oder soll er gleich weitergeleitet werden nach /login/USERNAME/?

Dafür hätte ich was:
RewriteCond (%{REMOTE_USER}) ^.+$
RewriteRule ^/login/$ /login/%1/ [L,R]

Erklärung: Wie dieses Bild zeigt, wird zuerst die Rewrite-Rule angefangen: <img src="http://httpd.apache.org/docs/images/mod_rewrite_fig2.gif" border=0 alt="">

Also wird hier getestet, ob die URL exakt ^/login/$ entspricht. Das ist etwas unflexibel, wenn die Login-Seite nicht so aufgerufen wurde. Nachbesserung überlasse ich dir.

Wenn die URL paßt, wird die RewriteCond geprüft. In diesem Falle teste ich die Server-Variable REMOTE_USER - da steht drin, mit welchem Namen sich der Benutzer angemeldet hat. Ich setze diesen Wert in runde Klammern, weil ich ihn später noch brauche. Runde Klammern sind bei regulären Ausdrücken ja wichtig.

Die Bedingung für den Usernamen: Er muß mindestens 1 Zeichen lang sein (das sagt ^.+$).

Wenn die Bedingung erfüllt ist, wird die URL umgeschrieben. Und zwar zu /login/%1/. Das %1 ist laut Dokumentation der Pattern aus der RewriteCond. Da dort nur eine Klammer ist, und die um den Usernamen gemacht wurde, steht also in %1 der Username. Mit $1 kriegt man übrigens Bestandteile aus der RewriteRule.

Die Parameter [L,R] sagen: Letzte Regel (danach werden keine weiteren mehr ausgeführt, wenn diese gepaßt hat), und Redirect (der Browser zeigt die neu gefundene URL an).

Verbesserungsansätze: Auch /login/index.html sollte irgendwie weiterleiten. Dabei kommt dir zuhilfe, daß es keine Unterverzeichnisse geben sollte, die allen Usern zugänglich sind. Deshalb kannst du z.B. abfragen, ob noch ein Dateiname hinter /login/ steht, der aber kein "/" enthalten darf (sonst wäre das ja ein Unterverzeichnis). Was du mit dem Dateinamen dann in der neuen URL machst, bleibt dir überlassen. Du kannst ihn grundsätzlich abschneiden, oder auch wieder hinter dem Usernamen anfügen.

- Sven Rautenberg