Johannes Zeller: Mod Rewrite -> Verzeichnis umleiten

Beitrag lesen

Hallo Ulf,

RewriteEngine On
RewriteRule ^(.*)forum/(.*)$ /www/htdocs/meinAccname/forum/$2

Guck mal in dein Error-Log, da müsste ein Meldung der Art

»mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.«

drin stehen. Das wirkt auf den ersten Blick sehr komisch, deswegen muss man sich klar machen, was deine RewriteRule überhaupt bewirkt:

Mit ^(.*)forum/(.*)$ erreichst du alle URLs, die die Zeichenkette "forum/" enthalten. Dieses wird dann umgeschrieben auf eine URL wie http://www.example.org/www/htdocs/meinAccname/forum/... Hier siehst du schon, dass die Zielangabe für den Rewrite nicht als Pfad im Dateisystem angegeben werden darf.

Da der Webserver, die umgeschriebene URL (http://www.example.org/www/htdocs/meinAccname/forum/...) nicht anders behandelt, als wenn die direkt eingegeben wäre, überprüft er wieder, ob die RewriteRule darauf zu trifft. Das ist der Fall, denn die URL enthält ja die Zeichenkette "forum/". Das geht theoretisch endlos so weiter, aber der Apache hat für solche Fälle eine Sicherung eingebaut, die nach einer bestimmten Anzahl von Rewrites, den Vorgang abbricht.

Wenn du Zugriff auf die httpd.conf bzw. deine Virtual-Host definition hättest, könntest du mod_alias verwenden:

~~~apache DocumentRoot "/www/htdocs/meinAccname/seitenverzeichnis/"
    Alias /forum /www/htdocs/meinAccname/forum/

  
Da ich vermute, dass dies nicht der Fall ist, musst du wohl doch bei mod\_rewrite bleiben.  
  
    ~~~apache
RewriteEngine On  
    # Kein Rewrite, wenn der REQUEST_URI mit /forum beginnt  
    RewriteCond %{REQUEST_URI} !^/forum  
    # Kein Rewrite, wenn der REQUEST_URI mit /seitenverzeichnis beginnt.  
    # Notwendig, damit der Rewrite nur einmal durchgeführt wird  
    RewriteCond %{REQUEST_URI} !^/seitenverzeichnis  
    # Ansonsten Alles auf /seitenverzeichnis/$1 umschreiben.  
    RewriteRule (.*) /seitenverzeichnis/$1

Die Umgebungsvariable REQUEST_URI enthält den Teil der URL, ohne Protokoll- und Host-Angabe, d.h. bei http://www.example.org/foo/bar den String "/foo/bar".

Schöne Grüße,

Johannes