Stoppt die Vorratsdatenspeicherung! Jetzt klicken &handeln! Willst du auch an der Aktion teilnehmen? Hier findest du alle relevanten Infos
und Materialien:
Cost of the War in Iraq
(JavaScript Error)

Endgame
Blue Truth

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

  1. Modul geladen?
  2. Jede Regel wird ignoriert – es passiert rein gar nichts
  3. Fehler 403 Forbidden
  4. Fehler 500 Internel Server Error
  5. Einzelne Regeln laufen nicht oder nicht richtig (auch Bilder werden nicht geladen, 404 Not Found)
  6. 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:

    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)

    1. 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)

    2. 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.

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:

  1. Ü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

  2. .htaccess-Datei: Stelle sicher, dass die Datei in dem Zeichensatz ANSI gespeichert wurde und im ASCII-Modus auf den Server geladen wurde.
  3. 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

  4. 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

    1. 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. Also

        Code:

        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 sollen

        Code:

        . – der Punkt: bspw. RewriteRule ^index\.php$ /index.html

        + – das Pluszeichen: \+

        * – der Stern: etc.

        ^ – …

        $ – Dollarzeichen

        [Leerzeichen] bspw. hallo\ welt

        ? – Fragezeichen

        \ – Backslash

        | – …

        ( – sämtliche Klammern

        )

        [

        {

    2. 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, also

        Code:

        RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?ort=$1&zeug=$2 [QSA,L]

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.



Keine Kommentare “mod_rewrite FAQ”

  (RSS Feed für diese Kommentare)