Jérôme Gamez: mod_rewrite:: maximum number of internal redirects reached

Hallihallo!

Wenn ich eine URI aufrufe, soll die .htaccess-Datei prüfen, ob das Verzeichnis "app" existiert. Falls es existiert, soll ein Rewrite dorthin gemacht werden, falls nicht, soll ein Rewrite zum Verzeichnis "libs/install" gemacht werden.

Im Verzeichnis "libs/install" wird ein Installer angestoßen, der das "app"-Verzeichnis dann erstellt.

<IfModule mod_rewrite.c>
    RewriteEngine on

RewriteCond app -d
 RewriteRule    ^$    app/webroot/    [L]
 RewriteRule    (.*) app/webroot/$1    [L]

RewriteCond libs !-d
 RewriteRule    ^$    libs/install/    [L]
 RewriteRule    (.*) libs/install/$1    [L]
</IfModule>

Im Verzeichnis libs/install ist folgende .htaccess-Datei:

<IfModule mod_rewrite.c>
    RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?step=$1 [QSA,L]
</IfModule>

Wenn das Verzeichnis "app" tatsächlich existiert, funktioniert alles wie gewünscht. Wenn es nicht existiert, bekomme ich einen 500 Internal Server Error, im error_log mit folgender Fehlermeldung:

[Tue Jan 01 17:08:40 2008] [error] [client 127.0.0.1] mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.

Das rewrite_log zeigt Folgendes:

127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#92f050/initial] (3) [per-dir /Users/jg/Development/shushmvc/] strip per-dir prefix: /Users/jg/Development/shushmvc/ ->
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#92f050/initial] (3) [per-dir /Users/jg/Development/shushmvc/] applying pattern '^$' to uri ''
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#92f050/initial] (4) RewriteCond: input='app' pattern='-d' => not-matched
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#92f050/initial] (3) [per-dir /Users/jg/Development/shushmvc/] strip per-dir prefix: /Users/jg/Development/shushmvc/ ->
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#92f050/initial] (3) [per-dir /Users/jg/Development/shushmvc/] applying pattern '(.*)' to uri ''
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#92f050/initial] (2) [per-dir /Users/jg/Development/shushmvc/] rewrite  -> app/webroot/
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#92f050/initial] (3) [per-dir /Users/jg/Development/shushmvc/] add per-dir prefix: app/webroot/ -> /Users/jg/Development/shushmvc/app/webroot/
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#92f050/initial] (2) [per-dir /Users/jg/Development/shushmvc/] strip document_root prefix: /Users/jg/Development/shushmvc/app/webroot/ -> /app/webroot/
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#92f050/initial] (1) [per-dir /Users/jg/Development/shushmvc/] internal redirect with /app/webroot/ [INTERNAL REDIRECT]
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#93b648/initial/redir#1] (3) [per-dir /Users/jg/Development/shushmvc/] add path info postfix: /Users/jg/Development/shushmvc/app -> /Users/jg/Development/shushmvc/app/webroot/
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#93b648/initial/redir#1] (3) [per-dir /Users/jg/Development/shushmvc/] strip per-dir prefix: /Users/jg/Development/shushmvc/app/webroot/ -> app/webroot/
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#93b648/initial/redir#1] (3) [per-dir /Users/jg/Development/shushmvc/] applying pattern '^$' to uri 'app/webroot/'
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#93b648/initial/redir#1] (3) [per-dir /Users/jg/Development/shushmvc/] add path info postfix: /Users/jg/Development/shushmvc/app -> /Users/jg/Development/shushmvc/app/webroot/
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#93b648/initial/redir#1] (3) [per-dir /Users/jg/Development/shushmvc/] strip per-dir prefix: /Users/jg/Development/shushmvc/app/webroot/ -> app/webroot/
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#93b648/initial/redir#1] (3) [per-dir /Users/jg/Development/shushmvc/] applying pattern '(.*)' to uri 'app/webroot/'
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#93b648/initial/redir#1] (2) [per-dir /Users/jg/Development/shushmvc/] rewrite app/webroot/ -> app/webroot/app/webroot/
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#93b648/initial/redir#1] (3) [per-dir /Users/jg/Development/shushmvc/] add per-dir prefix: app/webroot/app/webroot/ -> /Users/jg/Development/shushmvc/app/webroot/app/webroot/
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#93b648/initial/redir#1] (2) [per-dir /Users/jg/Development/shushmvc/] strip document_root prefix: /Users/jg/Development/shushmvc/app/webroot/app/webroot/ -> /app/webroot/app/webroot/
127.0.0.1 - - [01/Jan/2008:17:16:22 +0100] [shushmvc/sid#88fba0][rid#93b648/initial/redir#1] (1) [per-dir /Users/jg/Development/shushmvc/] internal redirect with /app/webroot/app/webroot/ [INTERNAL REDIRECT]
(und immer so weiter)

An dieser Stelle weiß ich leider nicht weiter und hoffe, dass mir hier jemand fachmännisch helfen kann :).

Beste Grüße

  • Jérôme
  1. Moin!

    Wenn das Verzeichnis "app" tatsächlich existiert, funktioniert alles wie gewünscht. Wenn es nicht existiert, bekomme ich einen 500 Internal Server Error, im error_log mit folgender Fehlermeldung:

    [Tue Jan 01 17:08:40 2008] [error] [client 127.0.0.1] mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.

    Was ist denn für den 404er als Fehlermeldung/Fehlerseite konfiguriert? Diese wird auch von mod rewrite behandelt.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
    1. Was ist denn für den 404er als Fehlermeldung/Fehlerseite konfiguriert? Diese wird auch von mod rewrite behandelt.

      Fehlerseiten habe ich noch nicht definiert, aber gelten die nicht nur für externe HTTP-Zugriffe? Hier arbeite ich ja nur mit internen Verzeichnissen - der Besucher der Website bekommt von diesen Verzeichnissen (app und libs) ja gar nichts mit... oder?

      Ich habe aber mal was eingestellt und die entsprechende Datei auch erstellt:

      ErrorDocument 404 404.html

      <IfModule mod_rewrite.c>
          RewriteEngine on

      RewriteCond app -d
       RewriteRule    ^$    app/webroot/    [L]
       RewriteRule    (.*) app/webroot/$1    [L]

      RewriteCond app !-d
       RewriteRule    ^$    libs/install/    [L]
       RewriteRule    (.*) libs/install/$1    [L]
      </IfModule>

      Der Fehler bleibt aber bestehen.

  2. echo $begrüßung;

    Im Verzeichnis "libs/install" wird ein Installer angestoßen, der das "app"-Verzeichnis dann erstellt.

    Bis dahin kommst du gar nicht. Das RewriteLog (schon mal sehr gut, dass du es gefunden hast) zeigt, dass die Schleife bereits vorher auftritt.

    RewriteCond app -d
    RewriteRule    ^$    app/webroot/    [L]
    RewriteRule    (.*) app/webroot/$1    [L]

    Die erste Rule greift beim Aufruf von /. Die Cond passt nicht, app ist kein Verzeichnis, die Regel wird nicht beachtet. Die zweite Rule passt, es findet ein interner Redirect statt. Das ist die Stelle, an der sich im Log die rid ändert. Nun wird dein Regelwerk erneut durchlaufen, weil der interne Redirect wie ein neuer Request behandelt wird. Diesmal wird jedoch nach /app/webroot/ gefragt. Die erste Regel greift nicht, die zweite aber, was zu einem erneuten Redirect (diesmal nach /app/webroot/app/webroot/) führt, bis irgendwann der Redirekt-Zähler überläuft.

    Ich sehe nicht, wo du nach /libs/install weiterleitest ...

    echo "$verabschiedung $name";

    1. Hallo dedlfix!

      Vielen Dank schon mal für deine Antwort. Ich sehe gerade, dass ich meine .htaccess falsch hierher geschrieben habe (das Ergebnis ist aber dasselbe), die korrekte Datei lautet:

      <IfModule mod_rewrite.c>
          RewriteEngine on

      RewriteCond app -d
       RewriteRule    ^$    app/webroot/    [L]
       RewriteRule    (.*) app/webroot/$1    [L]

      RewriteCond app !-d
       RewriteRule    ^$    libs/install/    [L]
       RewriteRule    (.*) libs/install/$1    [L]
      </IfModule>

      So dass nach meiner Vorstellung im ersten Abschnitt steht, was getan werden soll, wenn das Verzeichnis "app" da ist, und im zweiten, wenn es nicht da ist.

      Ist das vielleicht grundsätzlich die falsche Methode bzw. geht das besser/eleganter?

      Wenn das Verzeichnis nicht da ist, sind die ersten Zeilen im rewrite_log die folgenden:

      127.0.0.1 - - [01/Jan/2008:19:38:41 +0100] [shushmvc/sid#88fba0][rid#931050/initial] (3) [per-dir /Users/jg/Development/shushmvc/] strip per-dir prefix: /Users/jg/Development/shushmvc/ ->
      127.0.0.1 - - [01/Jan/2008:19:38:41 +0100] [shushmvc/sid#88fba0][rid#931050/initial] (3) [per-dir /Users/jg/Development/shushmvc/] applying pattern '^$' to uri ''
      127.0.0.1 - - [01/Jan/2008:19:38:41 +0100] [shushmvc/sid#88fba0][rid#931050/initial] (4) RewriteCond: input='app' pattern='-d' => not-matched
      127.0.0.1 - - [01/Jan/2008:19:38:41 +0100] [shushmvc/sid#88fba0][rid#931050/initial] (3) [per-dir /Users/jg/Development/shushmvc/] strip per-dir prefix: /Users/jg/Development/shushmvc/ ->
      127.0.0.1 - - [01/Jan/2008:19:38:41 +0100] [shushmvc/sid#88fba0][rid#931050/initial] (3) [per-dir /Users/jg/Development/shushmvc/] applying pattern '(.*)' to uri ''
      127.0.0.1 - - [01/Jan/2008:19:38:41 +0100] [shushmvc/sid#88fba0][rid#931050/initial] (2) [per-dir /Users/jg/Development/shushmvc/] rewrite  -> app/webroot/

      In Zeile zwei wird schon ein Pattern angewandt, in Zeile 3 erst die Prüfung gemacht. Und obwohl die Prüfung ergibt, dass "app" kein Verzeichnis ist, wird danach noch mal ein Pattern angewandt und irgendwas mit app/webroot gemacht.

      In meiner .htaccess-Datei muss doch ein Fehler sein!

      Viele Grüße

      • Jérôme
      1. echo $begrüßung;

        RewriteCond app -d
        RewriteRule    ^$    app/webroot/    [L]

        Das ist eine Regel, erweitert um eine Condition. Die kommt beim ersten Durchlauf zum Einsatz, weil sie da passt.

        RewriteRule    (.*) app/webroot/$1    [L]

        Das ist eine zweite Regel, die passt ab dem zweiten Durchlauf jedes Mal,

        RewriteCond app !-d
        RewriteRule    ^$    libs/install/    [L]
        RewriteRule    (.*) libs/install/$1    [L]

        weswegen der Rest unbeachtet bleibt. Eine RewriteCond gilt nur für die eine darauf folgende RewriteRule, nicht für alle weiteren. Meiner ungeprüften Meinung nach muss der Test auf das Nichtvorhandensein des app nach oben. Damit landest du schon mal in libs/install. Allerdings wird nach dem internen Redirekt dorthin diese .htaccess erneut ausgeführt, so dass die Endlos-Schleife bestehen bleibt. Das Problem ist, dass diese .htaccess im Hauptverzeichnis liegt und jedes Mal zur Anwendung kommt, auch wenn nach Unterverzeichnisse gefragt wird. Du müsstest also für alle Requests nach Unterverzeichnissen die Ausführung der Redirect-Regeln unterbinden. Sicher gibt es da noch eine elegantere Lösung ...

        echo "$verabschiedung $name";

      2. Hi,

        unabhaengig vom aktuellen Problem:

        In Zeile zwei wird schon ein Pattern angewandt, in Zeile 3 erst die Prüfung gemacht.

        Das ist normal.
        Es wird immer zuerst die Bdingung der RewriteRule ueberprueft, und nur wenn diese zutrifft, auch noch die RewriteCond, bevor dann bei deren Zutreffen der Rule entsprechend umgeleitet wird.

        Ein kleiner Regex-Check auf einen String "kostet" idR. weniger, als auf der Festplatte nach einer Datei zu suchen - deshalb diese Reihenfolge.

        MfG ChrisB