mod_rewrite FAQ
FAQ, mögliche Fehlerquellen und Fehlermeldungen beim Gebrauch von mod_rewrite
-> 1.-3. behandelt die Frage, ob mod_rewrite überhaupt auf dem Server läuft,
-> 4.-5. einzelne Problemstellungen
- Modul geladen?
- Jede Regel wird ignoriert – es passiert rein gar nichts
- Fehler 403 Forbidden
- Fehler 500 Internel Server Error
- Einzelne Regeln laufen nicht oder nicht richtig (auch Bilder werden nicht geladen, 404 Not Found)
- FAQ: Q & A (questions and answers)
1. Ist das Modul mod_rewrite überhaupt geladen?
Die primäre Voraussetzung um mod_rewrite zu nutzen ist, dass das Modul im Apache-Webserver überhaupt geladen ist.
Lösung: Sofern PHP als Modul (nicht CGI) auf dem Server läuft: Gucke im Output von phpinfo() unter "apache" und dann Loaded Modules, ob das Modul mod_rewrite dort auftaucht.
2. Du hast in der .htaccess folgende Anweisung stehen, es passiert aber nichts. Sämtliche Regeln laufen auch nicht. Auch in den Log-Dateien steht nichts.
- Füge in eine .htaccess im document root (also /.htaccess) folgenden Code ein ("google-Test"):
Code:
RewriteEngine On
RewriteRule ^ http://www.google.de [R,L]
Rufe dann im Browser z.B. /abc/ auf. Du solltest dann immer auf google.de weitergeleitet werden. Ist das der Fall: Dann solltest du mod_rewrite problemlos nutzen können. Sollte der Test jedoch nicht funktionieren:
Ursache: Die Direktive AllowOverride in der httpd.conf für deinen <Directory>-Abschnitt steht auf none oder erlaubt nicht "FileInfo" zu überschreiben.
In AllowOverride wird quasi angegeben, was in .htaccess-Dateien alles genutzt werden kann (bzw. welche Einstellungen aus der httpd.conf überschrieben werden können). Für den Gebrauch von mod_rewrite muss FileInfo überschrieben werden dürfen.
Lösung: Ohne Zugriff auf die Server-Config kann man da nichts machen, siehe 6.; Minimal-Config im <Directory /www/user1/htdocs/>also
Code:
AllowOverride FileInfo
. Wichtig dabei ist das Setzen von AllowOverride im richtigen <Directory>-Container. Davon gibt es in der httpd.conf mehere. Suche den heraus, der dein DocumentRoot enthält, also bspw. <Directory /www/user1/htdocs>, jedoch nicht in <Directory />.
3. Bei der unter 2. aufgeführten .htaccess-Datei kommt beim Webseitenaufruf der Fehler 403 Forbidden.
- In der Apache-Errorlog steht dazu:
- in der .htaccess oben folgende Zeile einfügen
Code:
Options +FollowSymlinks
Das funktioniert aber nur, wenn du in der .htaccess die Direktive Options überschreiben darfst (vgl. Problem AllowOverride unter 2.). Wenn das Überschreiben von Options in .htaccess-Dateien nicht freigegeben ist, kommt beim Webseitenaufruf
Code:
500 Internal Server Error
dann wurde das Überschreiben eben nicht freigegeben und du kannst nicht Options +FollowSymlinks einfügen. In der Apache-Errorlog steht dazu
Code:
[alert] [client …] /www/user1/htdocs/.htaccess: Options not allowed here
Ohne Zugriff auf die httpd.conf kann man hier nichts machen, siehe 6.; es müssten FollowSymlinks oder SymLinksIfOwnerMatch in der Server-Config freigeschaltet werden (s. nächster Schritt)
- Wenn du Zugriff auf die Server-Config hast, in dem <Directory>-Abschnitt für deine htdocs, also bspw. <Directory /vaw/www>, jedoch nicht<Directory />
Code:
Options +FollowSymlinks
einfügen bzw. die vorhandene Options Direktive ergänzen.
Noch einmal– Achtung: Es gibt mehrere <Directory>-Abschnitte in der httpd.conf! zu erst <Directory />. Dieser Abschnitt ist restriktiv konfiguriert und vererbt (sofern nicht überschrieben) auf darunter liegende <Directory>-Abschnitte. Dort sollten keine Änderungen vorgenommen werden. FollowSymLinks daher in dem für die htdocs vorgesehenen Abschnitt <Directory /var/www> einfügen.
Code:
[error] [client …] Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden: /www/user1/htdocs/
Ursache: Das Nutzen von mod_rewrite in .htaccess-Dateien ist zwar erlaubt (vgl. 2., also AllowOverride ist korrekt gesetzt), jedoch ist bei der Direktive Options die ‘Option’ FollowSymLinks oder SymLinksIfOwnerMatch abgeschaltet.
FollowSymLinks bedeutet, dass der Server symbolischen Links folgt.
SymLinksIfOwnerMatch bedeutet, dass der Server nur symbolischen Links folgt, wo die Benuzerkennung von dem Link mit der Benutzerkennung des Zielverzeichnis / -datei übereinstimmt. Letzteres sollte wenn möglich vermieden werden (Performance).
Lösung: (mehrere Möglichkeiten)
4. Bei deiner eigenen RewriteRule kommt 500 – Internal Server Error
Ursache: In 90 % der Fälle ein Syntaxfehler in den RewriteRule(s) bzw. fehlerhafte .htaccess-Dateien (Endlosschleife, unzulässiges Überschreiben von Direktiven). Es könnte jedoch auch das Modul nicht geladen sein, vgl. 1. oben)
Lösung:
- Überprüfe deine Regel/Condition auf eventuelle Syntaxfehler, unter anderem Zeichen, die nicht escaped wurden (s. 5a, 2. Punkt). In der error.log steht dazu
Code:
–> bei einem Syntaxfehler in einer RewriteCondition
[alert] [client …] LOCAL_PATH_TO/.htaccess: RewriteCond: bad flag delimiters
–> oder bei einem Syntaxfehler in einer RewriteRule
[alert] [client …] LOCAL_PATH_TO/.htaccess: RewriteRule: bad flag delimiters - .htaccess-Datei: Stelle sicher, dass die Datei in dem Zeichensatz ANSI gespeichert wurde und im ASCII-Modus auf den Server geladen wurde.
- In der .htaccess werden Direktiven überschrieben (wie z.B. die Options-Direktive, [Options +FollowSymLinks] etc.), das Überschreiben dieser Direktiven wurde aber in der Server-Config (AllowOverride) unterbunden. In der Apache-Errorlog steht dazu
Code:
[alert] [client …] /www/user1/htdocs/.htaccess: Options not allowed here
- Endlosschleife / das Umleitungslimit wurde überschritten: Stelle sicher, dass die umgeschriebene Datei nicht wieder auf deine RewriteRule zutrifft. Beispiel für eine Endlosschleife
Code:
RewriteRule .* /index.php
In der Apache-Errorlog steht dazu
Code:
[error] [client …] mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use ‘RewriteOptions MaxRedirects’ to increase the limit if neccessary.
Abhilfe schafft das Ausschließen der Datei durch
Code:
RewriteRule !index\.php – [C]
über der jeweiligen (Problem verursachenden) RewriteRule. Im Endeffekt also
Code:
RewriteEngine On
RewriteRule !index\.php – [C]
RewriteRule ^ /index.phpÜbersetzt bedeutet das soviel wie "RewriteEngine aktivieren; wenn nicht die index.php angefordert wurde – mache nichts und verkette mit der nachfolgenden Regel". Also nur, wenn die index.php nicht angefordert wurde, wird die darunter stehende Regel ausgeführt.
Eine weitere Möglichkeit ist das Abändern der RewriteRule:Code:
RewriteRule ^ index.php
Hier also ohne führenden Slash bei der index.php, wenn sich die Datei mit der .htaccess-Datei in einem Verzeichnis befindet. In der rewrite_log steht dann
Code:
initial URL equal rewritten URL: /www/user1/htdocs/index.php[IGNORING REWRITE]
ACHTUNG: Das kann jedoch bei der Verwendung des [N]-Flags beim Behandeln von Unterverzeichnissen zu Fehlern führen. Der Apache kollabiert dann mit dem Rechner in der Form, dass der gesamte Virtuelle Speicher regelrecht "aufgefressen" wird.
5. Einzelne Regeln laufen nicht oder nicht richtig
- Sachen werden nicht gefunden – HTTP 404 Not Found kommt
- Bilder/Stylesheets/JavaScripts werden nicht mehr geladen/gefunden
Bilderverzeichnisse etc. müssen ggf. analog wie die index.php von den Rewrite-Regeln ausgenommen werden siehe 4a.. Alle Angaben zu Bildern etc. müssen ggf. absolut referenziert werden, insbesondere wenn virtuelle Verzeichnisse verwendet werden, die Seite also virtuell unter /aa/bb/cc/index.html zu finden ist. AlsoCode:
Also
<img src="/bilder/hallo.gif" />
statt wie bisher
<img src="../../bilder/hallo.gif" />notieren. Dann werden die Bild-Verzeichnisse immer von dem obesten Verzeichnis aus gesucht.
- Dokumente werden nicht gefunden: Einige besondere Zeichen wurden u.U. nicht escaped.
Bestimmte Zeichen sind eine Art Steuerzeichen. Wenn sie verwendet werden sollen, müssen sie durch Voranstellen von einem Backslash (\) escaped werden. Folgende Zeichen müssen escaped werden, sofern sie als String-Ausdruck in dem Pattern(/Searchstring)-Teil von RewriteRule oder RewriteCond Verwendung finden sollenCode:
. – der Punkt: bspw. RewriteRule ^index\.php$ /index.html
+ – das Pluszeichen: \+
* – der Stern: etc.
^ – …
$ – Dollarzeichen
[Leerzeichen] bspw. hallo\ welt
? – Fragezeichen
\ – Backslash
| – …
( – sämtliche Klammern
)
[
{
- Bilder/Stylesheets/JavaScripts werden nicht mehr geladen/gefunden
- Es passiert nichts, die RewriteRule "matched" nicht oder funktioniert fehlerhaft; die Regel unter 2. funktioniert aber
- Eventuell ist die Regel fehlerhaft. Achte auf die Notation des Slashs
Code:
RewriteRule ^/index\.php$ /index.html [L]
ist in einer.htaccess-Datei falsch. Die Zeichenkette des Search-Strings in der RewriteRule (index.php) beginnt (^) in .htaccess-Dateien NICHT mit einem Slash. Der Slash muss nur in der ServerConfig, also im <Directory>-Abschnitt angegeben werden. Richtig muss die Regel also lauten
Code:
RewriteRule ^index\.php$ /index.html [L]
- Die Variablen werden bei folgender RewriteRule falsch übergeben, die SESSIONID geht verloren
-> bei /werkstatt/hammer/?PHPSESSID=a3a634ss467w soll aufgerufen werden
-> index.php?ort=werkstatt&zeug=hammer&PHPSESSID=a3a634ss467w.
Code:
RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?ort=$1&zeug=$2 [L]
Die Session-ID verschwindet aber, warum?
Weil der QueryString (so nennt sich der teil hinter dem Fragezeichen in der URI) durch einen anderen ersetzt wird (ort=$1&zeug=$2). Um aber den QueryString nur zu ergänzen, muss das QSA-Flag notiert werden (QueryString Append, alsoCode:
RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?ort=$1&zeug=$2 [QSA,L]
- Eventuell ist die Regel fehlerhaft. Achte auf die Notation des Slashs
6. Frage deinen Provider
, ob er die hinter dem Verweis auf diesen Unterpunkt stehende Anweisung in der Server-Config für dein Directory ändern kann.



