mod_rewrite: Fehler in der .htaccess
Willi
- webserver
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:
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
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
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
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
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
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
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
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
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-500RewriteEngine 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
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
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
Hallo Gunther,
also ich versuche gerne nochmal weiterzuhelfen - ob's was bringt weiss ich jedoch nicht.
Dankeschön :-)
- 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.
- 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
- 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.
- 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)
- 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.
- 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
Hallo Willi,
auf ein Neues ... ;).
- 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]
- 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
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