Willi: mod_rewrite: Fehler in der .htaccess

Hallo liebe Forenteilnehmer :-)

Ich habe derzeit ein Problem mit mod_rewrite.
Erstmal mein Inhalt der .htaccess:

-------

[...]
ErrorDocument 500 /abi10-asg/error-500

RewriteEngine on
RewriteCond   %{REQUEST_FILENAME}   !-d
RewriteCond   %{REQUEST_FILENAME}   !-f
RewriteRule   ^_([A-Z][a-z]*)$ einsteckbrief.php?name=$1
RewriteRule   ^error-([0-9]{3})$ error.php?code=$1
RewriteRule   ^([^/_]*)$ $1.php

-------

Meine Ziele sind also:

  • bei Fehlern wird man auf error-xxx weitergeleitet, welches wiederrum auf error.php?code=xxx zeigt (geht!)
  • wenn der Seitenname mit _ anfängt, soll man auf einsteckbrief.php?name=xxx weitergeleitet werden (geht!)
  • wenn man nur z.B. /index eingibt, soll man auf index.php weitergeleitet werden - das läuft bei mir nicht.
    Stattdessen kommt immer ein Interner Server Fehler, aber auch nicht mal mit "meiner" Fehlermeldung, sondern mit der Standardfehlermeldung. Mit dem Zusatz "Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request."

In der error.log steht dazu folgendes:
"Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace."

Kann mir jemand sagen, woher das kommt und welchen Fehler ich in meiner .htaccess habe?
Über konstruktive Posts würde ich mich freuen!

Grüße,
Willi

  1. Hallo Willi!

    RewriteRule   ^([1]*)$ $1.php

    • wenn man nur z.B. /index eingibt, soll man auf index.php weitergeleitet werden - das läuft bei mir nicht.
      "Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace."

    Mit Deinem gierigen RegExp wundert mich das nicht. Schau mal passiert:
    ^: Beginn des Strings (Nullzeichen)

    Nur hier gibst Du keine Begrenzung! Was passiert also? index wird zu index.php gewandelt, da greift aber wieder die RegExp: Im String index.php steht ja nichts davor (^), ist kein slash und kein Unterstrich enthalten ([1:1]), besteht aus 0 bis vielen Zeichen bis zum Stringende, also wird versucht wieder umzuleiten zu $1.php, was jetzt index.php.php ist und auch gematcht wird; nach ein paar mal hast Du index.php.php.php.php.php.php.php - und es passt immer noch zum Suchmuster. Die Ressource gibt es nicht.

    Wegen des 500er kann ich Dir leider nichts sagen. Versuch erstmal nach vorigem Entfernen des letzten Rules (dessen RegExp ich eben auseinandergenommen habe), ob ein absichtlich fehlerhafter Script Dein Error Document aufruft.

    Viele Grüße aus Frankfurt/Main,
    Patrick

    --

    _ - jenseits vom delirium - _
    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    Nichts ist unmöglich? Doch!
    Heute schon gegökt?

    1. kein slash und kein Unterstrich
      *: keins oder beliebig viele Zeichen bis
      $: Stringende ↩︎ ↩︎

    1. Hallo Patrick,

      RewriteRule   ^([1]*)$ $1.php

      Mit Deinem gierigen RegExp wundert mich das nicht. Schau mal passiert:
      ^: Beginn des Strings (Nullzeichen)

      Nur hier gibst Du keine Begrenzung! Was passiert also? index wird zu index.php gewandelt, da greift aber wieder die RegExp: Im String index.php steht ja nichts davor (^), ist kein slash und kein Unterstrich enthalten ([1:1]), besteht aus 0 bis vielen Zeichen bis zum Stringende, also wird versucht wieder umzuleiten zu $1.php, was jetzt index.php.php ist und auch gematcht wird; nach ein paar mal hast Du index.php.php.php.php.php.php.php - und es passt immer noch zum Suchmuster. Die Ressource gibt es nicht.

      Stimmt.
      Aber genau deswegen gibt es doch die RewriteConds:
      RewriteCond   %{REQUEST_FILENAME}   !-d
      RewriteCond   %{REQUEST_FILENAME}   !-f
      Nur wenn es die Datei unter diesen Namen nicht gibt, wird weitergeleitet. Nach dem ersten Umleiten von index auf index.php sollte doch *eigentlich* daher nicht mehr umgeleitet werden - oder?

      Grüße,
      Willi


      1. kein slash und kein Unterstrich
        *: keins oder beliebig viele Zeichen bis
        $: Stringende ↩︎ ↩︎

      1. Hallo Willi,

        RewriteRule   ^([1]*)$ $1.php

        Mit Deinem gierigen RegExp wundert mich das nicht. Schau mal passiert:
        ^: Beginn des Strings (Nullzeichen)

        Nur hier gibst Du keine Begrenzung! Was passiert also? index wird zu index.php gewandelt, da greift aber wieder die RegExp: Im String index.php steht ja nichts davor (^), ist kein slash und kein Unterstrich enthalten ([1:1]), besteht aus 0 bis vielen Zeichen bis zum Stringende, also wird versucht wieder umzuleiten zu $1.php, was jetzt index.php.php ist und auch gematcht wird; nach ein paar mal hast Du index.php.php.php.php.php.php.php - und es passt immer noch zum Suchmuster. Die Ressource gibt es nicht.

        Stimmt.
        Aber genau deswegen gibt es doch die RewriteConds:
        RewriteCond   %{REQUEST_FILENAME}   !-d
        RewriteCond   %{REQUEST_FILENAME}   !-f
        Nur wenn es die Datei unter diesen Namen nicht gibt, wird weitergeleitet. Nach dem ersten Umleiten von index auf index.php sollte doch *eigentlich* daher nicht mehr umgeleitet werden - oder?

        Es kommt auf die Reihenfolge an. Durch die gebräuchliche Form der Notation, erst die RewriteCondition(s) und dann die RewriteRule(s) zu notieren, ist man geneigt, auch diese Reihenfolge für das Abarbeiten anzunehmen. Dem ist aber nicht so. Sondern es werden _erst_ die Rules geprüft ob sie matchen und nur wenn dem so ist, werden _anschließend_ die Conditions geprüft. Und nach jedem "Treffer", also dem Matchen einer Rule, beginnt quasi einer neuer Durchlauf, d.h. beginnt das Spielchen von vorne. Daher muss man unbedingt darauf achten, dass eine Veränderung durch eine Rule anschließend nicht mehr matched, da ansonsten wie bei dir eine Endlosschleife eintritt.

        Gruß Gunther


        1. kein slash und kein Unterstrich
          *: keins oder beliebig viele Zeichen bis
          $: Stringende ↩︎ ↩︎

        1. Hallo Gunther,

          Es kommt auf die Reihenfolge an. Durch die gebräuchliche Form der Notation, erst die RewriteCondition(s) und dann die RewriteRule(s) zu notieren, ist man geneigt, auch diese Reihenfolge für das Abarbeiten anzunehmen. Dem ist aber nicht so. Sondern es werden _erst_ die Rules geprüft ob sie matchen und nur wenn dem so ist, werden _anschließend_ die Conditions geprüft. Und nach jedem "Treffer", also dem Matchen einer Rule, beginnt quasi einer neuer Durchlauf, d.h. beginnt das Spielchen von vorne. Daher muss man unbedingt darauf achten, dass eine Veränderung durch eine Rule anschließend nicht mehr matched, da ansonsten wie bei dir eine Endlosschleife eintritt.

          Ah, danke für den Tipp. Ich habe also nun noch eine Prüfung eingebaut, ob ein Punkt drin vorkommt: ^([^/_.]*)$ $1.php
          Leider - weiß jetzt aber nicht, ob das daher kommt oder wegen etwas anderem - funktioniert jetzt die RewriteRegel, die von _xxx auf bla.php?name=xxx umleiten soll nicht mehr... Ich werde versuchen, das durch Debuggen zu beheben.

          Grüße,
          Willi

        2. Hallo Gunther!

          Daher muss man unbedingt darauf achten, dass eine Veränderung durch eine Rule anschließend nicht mehr matched, da ansonsten wie bei dir eine Endlosschleife eintritt.

          Dachtest Du dabei an das Flag "L":
          RewriteRule   ^([^/_]*)$ $1.php [L] ?

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          Nichts ist unmöglich? Doch!
          Heute schon gegökt?
          1. Hallo Patrick!

            Daher muss man unbedingt darauf achten, dass eine Veränderung durch eine Rule anschließend nicht mehr matched, da ansonsten wie bei dir eine Endlosschleife eintritt.

            Dachtest Du dabei an das Flag "L":
            RewriteRule   ^([^/_]*)$ $1.php [L] ?

            Nein, nicht unbedingt. Bewirkt der [L] ~ last Schalter denn nicht nur, dass keine weiteren Rules mehr ausgeführt werden? Das löst sein Problem der Endlosschleife ja auch nicht. Den Schalter [NC] (Großschreibung / Kleinschreibung nicht beachten) sollte man aber imho immer verwenden, ansonsten taucht bspw. bei "Index" gleich das nächste Problem auf.

            Aber ich bin absolut kein Experte für mod_rewrite. Wenn ich es selber schon mal verwende (meist eh nur zu Testzwecken), dann versuche ich es immer so einfach wie möglich zu halten. Trotzdem dauert es meist eine ganze Weile, bis es wie gewünscht werkelt ;).

            An Willis Stelle würde ich die Rules mit den zugehörigen Conditions aufteilen und zusätzlich evt. auf die index.php prüfen. Und da dann den von dir eingangs erwähnten [L] Schalter verwenden. Aber wie gesagt - bin bei weitem kein Experte auf dem Gebiet. Von daher bitte alles als gutgemeinten Tipp (unter Vorbehalt) sehen.

            Gruß aus Köln
            Gunther

            1. Hallo Gunther,

              An Willis Stelle würde ich die Rules mit den zugehörigen Conditions aufteilen und zusätzlich evt. auf die index.php prüfen. Und da dann den von dir eingangs erwähnten [L] Schalter verwenden. Aber wie gesagt - bin bei weitem kein Experte auf dem Gebiet. Von daher bitte alles als gutgemeinten Tipp (unter Vorbehalt) sehen.

              Ich prüfe jetzt einfach noch auf den Punkt innerhalb des Dateinamens (wie in einem anderen Post bereits beschrieben), und mittlerweile funktioniert auch alles nach meinen Wünschen.
              Hier nochmal meine fertig .htaccess, falls jemand noch irgendwelche Fehler/Ungereimtheiten findet, einfach posten :)

              *********

              [...]
              ErrorDocument 500 /error-500

              RewriteEngine on
              RewriteCond   %{REQUEST_FILENAME}   !-d
              RewriteCond   %{REQUEST_FILENAME}   !-f
              RewriteRule   ^_([a-z]*)$ einsteckbrief.php?name=$1
              RewriteRule   ^error-([0-9]{3})$ error.php?code=$1
              RewriteRule   ^([^/_.]*)$ $1.php
              RewriteRule   ^$ index.php

              *********

              Das Script tut jetzt genau die Dinge, die ich mir im Eingangspost gewünscht habe, danken an Gunther und Patrick für die Hilfestellung!

              Grüße,
              Willi

              1. Hallo Willi,

                Ich prüfe jetzt einfach noch auf den Punkt innerhalb des Dateinamens (wie in einem anderen Post bereits beschrieben), und mittlerweile funktioniert auch alles nach meinen Wünschen.

                Glückwunsch :-). Schön, wenn es klappt!

                Hier nochmal meine fertig .htaccess, falls jemand noch irgendwelche Fehler/Ungereimtheiten findet, einfach posten :)

                Eine Kleinigkeit noch (wie bereits vorher erwähnt):

                *********

                [...]
                ErrorDocument 500 /error-500

                RewriteEngine on
                RewriteCond   %{REQUEST_FILENAME}   !-d
                RewriteCond   %{REQUEST_FILENAME}   !-f
                RewriteRule   ^_([a-z]*)$ einsteckbrief.php?name=$1
                RewriteRule   ^error-([0-9]{3})$ error.php?code=$1
                RewriteRule   ^([^/_.]*)$ $1.php

                RewriteRule   ^$ index.php [NC]

                *********

                Das Script tut jetzt genau die Dinge, die ich mir im Eingangspost gewünscht habe ...

                Es ist auch immer wieder sehr nett, wenn die Problemlösung anschließend auch noch gepostet wird. Erstens freut das diejenigen, die sich beteiligt haben, und zweitens profitiert das Archiv auch davon - Danke!

                Gruß Gunther

                1. Hallo Gunther,

                  Hier nochmal meine fertig .htaccess, falls jemand noch irgendwelche Fehler/Ungereimtheiten findet, einfach posten :)

                  Eine Kleinigkeit noch (wie bereits vorher erwähnt):
                  [...] RewriteRule   ^$ index.php [NC]

                  Leider funktioniert es jetzt nicht mehr, wenn ich direkt auf die Domain zugreife, beim Zugreifen auf http://abi10-asg.de tritt ein 404-Fehler auf...

                  Das Script tut jetzt genau die Dinge, die ich mir im Eingangspost gewünscht habe ...

                  Es ist auch immer wieder sehr nett, wenn die Problemlösung anschließend auch noch gepostet wird. Erstens freut das diejenigen, die sich beteiligt haben, und zweitens profitiert das Archiv auch davon - Danke!

                  Genau das habe ich auch gelesen ;-) Deswegen wollte ich auch mal mit gutem Beispiel vorangehen :-)

                  Gruß Gunther

                  Grüße zurück,
                  Willi

                  1. Hallo Willi,

                    Leider funktioniert es jetzt nicht mehr, wenn ich direkt auf die Domain zugreife, beim Zugreifen auf http://abi10-asg.de tritt ein 404-Fehler auf...

                    also ich versuche gerne nochmal weiterzuhelfen - ob's was bringt weiss ich jedoch nicht.

                    Zunächst muss ich nochmal nachfragen:
                    1. Wenn nur die Domain eingegeben wird (ohne mod_rewrite!), also "http://abi10-asg.de", was macht dein Server dann? Steht in der Adresszeile dann "http://abi10-asg.de/" und es wird die "index.php" ausgeführt?

                    2. Wann genau immer, soll per mod_rewrite auf die "index.php" umgeleitet werden?

                    3. Wie sieht es mit Unterverzeichnissen aus?

                    4. Hast du externe Dateien (bspw. css oder js), die aus bestimmten Verzeichnissen geladen werden?

                    5. Woher kommt die Umleitung für die Error-Dokumente?

                    6. Ist auf deinem Webserver Confixx (o.ä.) im Einsatz?

                    Ganz hilfreich ist übrigens auch http://www.modrewrite.de/ samt zugehörigem Forum (falls dir hier nicht noch von einem Profi weitergeholfen wird).

                    Gruß Gunther

                    1. Hallo Gunther,

                      also ich versuche gerne nochmal weiterzuhelfen - ob's was bringt weiss ich jedoch nicht.

                      Dankeschön :-)

                      1. Wenn nur die Domain eingegeben wird (ohne mod_rewrite!), also "http://abi10-asg.de", was macht dein Server dann? Steht in der Adresszeile dann "http://abi10-asg.de/" und es wird die "index.php" ausgeführt?

                      Exakt.

                      1. Wann genau immer, soll per mod_rewrite auf die "index.php" umgeleitet werden?

                      per mod_rewrite wenn abi10-asg.de/index aufgerufen wird,
                      per Serverkonfiguration wenn abi10-asg.de aufgerufen wird - sollte das durch mod_rewrite aber überschrieben werden, kann das auch per mod_rewrite wiederrum überschrieben werden

                      1. Wie sieht es mit Unterverzeichnissen aus?

                      Sind folgende vorhanden: acp; assets; files; fotos; gallery; include; js; mobile; style
                      Die Hauptdateien, die per mod_rewrite umgeschrieben werden sollen, befinden sich aber alle im Hauptverzeichnis.

                      1. Hast du externe Dateien (bspw. css oder js), die aus bestimmten Verzeichnissen geladen werden?

                      Ja... CSS und JS (JS aus /js und /, CSS aus /style)
                      (Falls du daraus hinauswillst: ja, es wird kein CSS mehr angezeigt, wenn ich einen Fehler auf einer anderen Verzeichnisebene habe... das kann ich allerdings verschmerzen)

                      1. Woher kommt die Umleitung für die Error-Dokumente?

                      Woher oder warum?
                      Mhm... weiß nicht, ich dachte, dass der Server auch extern (also sichtbar) auf die Error-Dateien umleitet, daher auch die Umschreibung error-xxx.

                      1. Ist auf deinem Webserver Confixx (o.ä.) im Einsatz?

                      Confixx? Keine Ahnung, es ist lediglich ein Hostingpaket von goneo.

                      Ganz hilfreich ist übrigens auch http://www.modrewrite.de/ samt zugehörigem Forum (falls dir hier nicht noch von einem Profi weitergeholfen wird).

                      Auf der Seite bin ich auch schon mehrmals gewesen, um Dinge in Sachen mod_rewrite nachzuschauen. Allerdings dachte ich, dass die Forenteilnehmer dieses Forums doch bestimmt auch einen Rat wissen - und mir ist das SELFHTML-Forum sympatischer :-)

                      Grüße,
                      Willi

                      1. Hallo Willi,

                        auf ein Neues ... ;).

                        1. Wann genau immer, soll per mod_rewrite auf die "index.php" umgeleitet werden?
                          per mod_rewrite wenn abi10-asg.de/index aufgerufen wird,
                          per Serverkonfiguration wenn abi10-asg.de aufgerufen wird - sollte das durch mod_rewrite aber überschrieben werden, kann das auch per mod_rewrite wiederrum überschrieben werden

                        RewriteRule ^index$ index.php [L,NC]

                        1. Woher kommt die Umleitung für die Error-Dokumente?
                          Woher oder warum?
                          Mhm... weiß nicht, ich dachte, dass der Server auch extern (also sichtbar) auf die Error-Dateien umleitet, daher auch die Umschreibung error-xxx.

                        Ah, ich hab's mittlerweile gesehen ...!
                        In deiner htaccess-Datei sind die Angaben bereits vorhanden. Somit kannst du dir diese RewriteRule schon mal sparen.
                        Siehe:
                        ErrorDocument 500 /abi10-asg/error-500
                        wird zu:
                        ErrorDocument 500 /abi10-asg/error.php?code=500
                        (entsprechend für die anderen Fehlerseiten)

                        Also evt. könnte es dann so funktionieren:

                        RewriteEngine on
                        RewriteCond   %{REQUEST_FILENAME}   !-d
                        RewriteCond   %{REQUEST_FILENAME}   !-f

                        RewriteRule   ^_([A-Z][a-z]*)$ einsteckbrief.php?name=$1
                        RewriteRule   ^index$ index.php [L,NC]

                        Gruß Gunther

                        1. Hallo,

                          Damit dieser Thread nicht ohne Lösung ins Archiv kommt, möchte ich ihn nochmal   pushen.
                          Ich habe mittlerweile auch noch mehrere Sachen ausprobiert - aber es kommt immer zu einem Fehler, wenn ich direkt auf die Domain (abi10-asg.de) zugreife, alle Dateien (index.php, aktuell.php, termine.php etc.) funktionieren problemlos - nur eben der Zugriff auf die Domain nicht.
                          Ich habe auch einen Thread bei modrewrite.de gestartet, aber auch da gab es - bisher - keine Lösung... Hier der Thread: modrewrite.de

                          Fänds echt cool, wenns hier noch ne Lösung geben würde :-)

                          Grüße,
                          Willi