raphael: Hab da Probleme mit mod_rewrite

Hallo,

ich will eine Authentifizierung einrichten welche dann mittels mod_rewrite in das jeweilige User-Verzeichnis weiter leidet (Verzeichnissname == Username).

Hier ein auszug aus meiner http.conf:

NameVirtualHost 80.243.46.52

<VirtualHost www.sachsenauktion.de>
   ServerAdmin admin@tc-mw.de
   DocumentRoot /usr/local/apache2/www/webalizer
   ServerName www.sachsenauktion.de

<Directory /usr/local/apache2/www/webalizer/user>
       Options Indexes -FollowSymLinks -SymLinksIfOwnerMatch +Includes Multiviews

AllowOverride None
       Order allow,deny
       Allow from all

AuthType Basic
       AuthName "Test"
       AuthUserFile /etc/httpd/passworte
       Require valid-user
       RewriteEngine On
   </Directory>

<IfModule mod_rewrite.c>
      RewriteLog /usr/local/apache/logs/rewrite/pass.log
      RewriteLogLevel 9
      RewriteCond (%{REMOTE_USER}) ^.+$
      RewriteRule ^/(.*) http://www.sachsenauktion.de/webalizer/user/%{REMOTE_USER}/index.htm$1 [L,R]
   </IfModule>
</Virtualhost>

Sieht zwar jetzt schon ein wenig wüst aus aber zumindest kommt es immer zu den selben Problemen. Die Anmeldung klappt ja soweit nur leidet er nicht weiter. Nehm ich FollowSymLink raus macht mod_rewrite nix. Dafür steht in der error-log ich sollte doch mal FollowSymLink aktivieren. OK mach ich´s halt, nun steht in der mod_rewrite_log "blablabla pass through blablabla" das sieht für mich so aus als würd er nun schon wieder nix machen.

Kann hier mal einer für Aufklärung sorgen, bin mit mod_rewrite nicht so vertraut.

cu

  1. Moin!

    <IfModule mod_rewrite.c>
          RewriteLog /usr/local/apache/logs/rewrite/pass.log
          RewriteLogLevel 9
          RewriteCond (%{REMOTE_USER}) ^.+$
          RewriteRule ^/(.*) http://www.sachsenauktion.de/webalizer/user/%{REMOTE_USER}/index.htm$1 [L,R]
       </IfModule>
    </Virtualhost>

    Sieht zwar jetzt schon ein wenig wüst aus aber zumindest kommt es immer zu den selben Problemen. Die Anmeldung klappt ja soweit nur leidet er nicht weiter. Nehm ich FollowSymLink raus macht mod_rewrite nix. Dafür steht in der error-log ich sollte doch mal FollowSymLink aktivieren. OK mach ich´s halt, nun steht in der mod_rewrite_log "blablabla pass through blablabla" das sieht für mich so aus als würd er nun schon wieder nix machen.

    Zwei Dinge:

    Erstens: Das "blablabla" im Logfile ist für die Fehlerbehebung sehr interessant. Warum hast du es nicht exakt angegeben?

    Zweitens: Dein Rewriting hat ein Problem.
    Wenn du die Doku unter http://httpd.apache.org/docs/mod/mod_rewrite.html genau studiert hast, dann wirst du wissen, wie das Rewriting funktioniert:

    Schritt 1: RewriteRule ^/(.*)
    Wenn der reguläre Ausdruck paßt, wird diese Regel zum Rewriting in Erwägung gezogen.

    Schritt 2: RewriteCond (%{REMOTE_USER}) ^.+$
    Es wird die Bedingung getestet. In diesem Fall wird geschaut, ob (%{REMOTE_USER}), also der String "("+REMOTE_USER+")" auf den regulären Ausdruck ^.+$ paßt. Das wird immer der Fall sein, weil auch dann, wenn REMOTE_USER leer ist, zwei Klammern im String stehen werden. DAS IST FEHLER 1!

    Schritt 3: RewriteRule ^/(.*) http://www.sachsenauktion.de/webalizer/user/%{REMOTE_USER}/index.htm$1 [L,R]
    Im dritten Schritt wird, wenn die RewriteCond zustimmen, der zweite Teil der RewriteRule als neue URL verwendet.
    Durch die hinten in [] angehängte Option L (Last Rule) sorgst du dafür, dass diese RewriteRule die letzte ist, die geprüft wird - dummerweise folgen sowieso keine weiteren Regeln mehr. Durch die Option R (Redirect) schickst du dem Browser einen Redirect, d.h. er fordert die neu gebildete URL nochmal an (womit du dann wieder in der RewriteRule landest!) DAS IST DISKUSSIONSWÜRDIG!

    Es wird auf folgende URL umgeleitet:
    http://www.sachsenauktion.de/webalizer/user/%{REMOTE_USER}/index.htm$1
    Hierbei werden die enthaltenen Variablen %{REMOTE_USER} und $1 ersetzt. REMOTE_USER ist klar, aber auch $1 erhält einen Wert, nämlich den, der in der ersten Klammer im regulären Ausdruck der RewriteRule steht.

    Beispiel: Wenn die URL /webalizer/user angefordert wurde, und sich der "testuser" angemeldet hat, wird das Rewriting auf folgende URL umleiten:
    http://www.sachsenauktion.de/webalizer/user/testuser/index.htmwebalizer/user
    Und das ist sicherlich nicht das, was du willst. Insbesondere geht es danach nämlich noch weiter: Der Redirect hat einen neuen Request nach der neuen URL zur Folge, bei dem das Rewriting natürlich auch wieder aktiv wird:
    /webalizer/user/testuser/index.htmwebalizer/user ist die neue URL, und die wird nach
    http://www.sachsenauktion.de/webalizer/user/testuser/index.htmwebalizer/user/testuser/index.htmwebalizer/user
    umgeleitet. Und so weiter, und so weiter...

    Deshalb: Du mußt die RewriteRule erstmal wesentlich weiter einschränken: Nur dann umleiten, wenn du dich wirklich im Anmelde-Hauptverzeichnis befindest. Und nur dann umleiten (RewriteCond), wenn der REMOTE_USER nicht leer ist - dafür gibts extra einen Vergleich: !="". Siehe auch die vielen Optionen der RewriteCond in der Doku.

    Es ist unter Umständen sogar gut, wenn du _nicht_ redirectest, sondern das Rewriting im Hintergrund erledigst. Dann sieht der User es nicht - und du läufst nicht in Endlosschleifen.

    - Sven Rautenberg

    --
    Diese Signatur gilt nur am Freitag.