RewriteRule führt zu "Request exceeded the limit of 10 internal redirects"

Sensonaut

New Member
Hallo Ihr!

Ich habe in meiner Apache Server-Konfiguration zwei Rewrite Rules definiert. Eine davon führt beim Zugriff von bestimmten Clients aus zum im Betreff genanntem Fehler:

Code:
# Answer DDOS-Attacks with error 403
RewriteCond %{REMOTE_ADDR} ^194\.8\.74|75\.[0-9]+$
RewriteRule ^(.*)$ - [F]

# Redirect to Homepage
RewriteRule ^/(index\.html)?$ /webapp/action/displayHomepage [R=301,L]

Wie man sieht, wollte ich beim Zugriff mit bestimmten IPs diese mit einem "Forbidden" abweisen. Leider klappt das aber nicht. Ich weiß, dass der Fehler auftritt, wenn Rewrite-Rules zu Rekursion führen. Aber warum passiert das hier?

Danke im Voraus, Titus
 
RewriteRule ^/(index\.html)?$ /webapp/action/displayHomepage [R=301,L]

Was immer auch hier: "webapp/action/displayHomepage" gemacht werden soll, es passiert innerhalb der lokalen Webserverumgebung, ergo greift wieder "RewriteCond %{REMOTE_ADDR}..." + Umleitung auf sich selbst.
 
Last edited by a moderator:
Ich möchte erreichen, dass bei Aufruf über die Domain (/) oder über index.html ein Redirect auf meine Web-Application ausgeführt wird. Innerhalb dieser erfolgt dann noch ein URL-Rewriting auf die Struts-Actions (wegen SEO).

Anfragen bestimmter Gruppe von Client-IPs sollen hingegen mit Error 403 beantwortet werden (simple DDOS-Abwehr).

Titus
 
Wenn du das LogLevel auf debug stellst, solltest du sehen, mit welchen URIs die internal redirects laufen (falls diese sich auf Grund von anderen Regeln ändern sollten). Über die RewriteLog siehst du zudem die Verarbeitungsschritte von mod_rewrite.

Da du einen externen Redirect sendest, kann deine zweite regel schon mal nicht dafür verantwortlich sein, ebenso scheidet die Erste aus. Insoweit solltest du überprüfen, ob insbesondere im Verzeichniskontext (<Directory>-Abschnitte oder gar .htaccess-Dateien RewriteRules notiert sind.

Regeln im Serverkontext führen ohne Zutun eines Moduls, welches einen internal redirect (immer wieder) einleitet, nicht zur Rekursion.
 
Ich habe jetzt mal für eine Weile das Debugging eingeschaltet. Dies hat gezeigt, dass die Client-IPs erkannt werden und wie gewünscht auf die Fehlerseite weitergeleitet wird (/error_docs/forbidden.html
). Mit dieser neuen URL (und der selben Client-IP) versucht Apache aber erneut, auf die Fehlerseite weiterzuleiten. Und so weiter. :(

Titus
 
Warum nimmst du nicht Deny? Wenn du bei Mod_Rewrite bleiben willst/must hilft ein Blick in die Dokumenation:
'nosubreq|NS' (not for internal sub-requests)

This flag forces the rewriting engine to skip a rewriting rule if the current request is an internal sub-request. For instance, sub-requests occur internally in Apache when mod_include tries to find out information about possible directory default files (index.xxx files). On sub-requests it is not always useful, and can even cause errors, if the complete set of rules are applied. Use this flag to exclude some rules.

To decide whether or not to use this rule: if you prefix URLs with CGI-scripts, to force them to be processed by the CGI-script, it's likely that you will run into problems (or significant overhead) on sub-requests. In these cases, use this flag.
 
und wie gewünscht auf die Fehlerseite weitergeleitet wird (/error_docs/forbidden.html
). Mit dieser neuen URL (und der selben Client-IP) versucht Apache aber erneut, auf die Fehlerseite weiterzuleiten.

Abgesehen davon, dass du den URL-path ausschließen kannst

RewriteRule !^/error_docs/ - [F]

stellt sich mir allerdings die Frage, warum das passiert. Denn im core wird, sofern das "Holen" des ErrorDocuments nicht HTTP_OK zurückliefert, abgebrochen und statt des erneuten Versuchs das ErrorDocument zu ziehen die einkompilierte Nachricht an den Client zurückgegeben (mit dem Hinweis, dass zusätzlich ein ...-Fehler beim "Holen" des ErrorDocuments aufgetreten ist).

'nosubreq|NS' (not for internal sub-requests)
Das bringt in diesem Fall nichts, da das ErrorDocument nicht über einen sub request lookup, sondern per internal redirect processing aufgerufen wird.
 
Das mit dem Deny habe ich schon versucht. Für den statischen Content klappt das auch. Der Zugriff auf die Web-Application im Tomcat erfolgt aber trotzdem noch. Und die Variante mit der ReWrite-Rule habe ich im Netz gefunden. Es war irgendwo als ein Anwendungsbeispiel für mod_rewrite beschrieben. Allerdings hatte ich mir das einfacher vorgestellt.

Ich poste hier mal einen Teil der Debug-Ausgabe:

Code:
194.8.74.10 - - [11/May/2009:17:06:24 +0200] [forum.mydomain.de/sid#8238070][rid#847e638/initial] (2) init rewrite engine with requested uri /
194.8.74.10 - - [11/May/2009:17:06:24 +0200] [forum.mydomain.de/sid#8238070][rid#847e638/initial] (3) applying pattern '^(.*)$' to uri '/'
194.8.74.10 - - [11/May/2009:17:06:24 +0200] [forum.mydomain.de/sid#8238070][rid#847e638/initial] (4) RewriteCond: input='194.8.74.10' pattern='^194\.8\.74|75\.[0-9]+$' => matched
194.8.74.10 - - [11/May/2009:17:06:24 +0200] [forum.mydomain.de/sid#8238070][rid#847e638/initial] (2) forcing responsecode 403 for /
194.8.74.10 - - [11/May/2009:17:06:24 +0200] [forum.mydomain.de/sid#8238070][rid#847fdc8/initial/redir#1] (2) init rewrite engine with requested uri /error_docs/forbidden.html
194.8.74.10 - - [11/May/2009:17:06:24 +0200] [forum.mydomain.de/sid#8238070][rid#847fdc8/initial/redir#1] (3) applying pattern '^(.*)$' to uri '/error_docs/forbidden.html'
194.8.74.10 - - [11/May/2009:17:06:24 +0200] [forum.mydomain.de/sid#8238070][rid#847fdc8/initial/redir#1] (4) RewriteCond: input='194.8.74.10' pattern='^194\.8\.74|75\.[0-9]+$' => matched
194.8.74.10 - - [11/May/2009:17:06:24 +0200] [forum.mydomain.de/sid#8238070][rid#847fdc8/initial/redir#1] (2) forcing responsecode 403 for /error_docs/forbidden.html
194.8.74.10 - - [11/May/2009:17:06:24 +0200] [forum.mydomain.de/sid#8238070][rid#84770a0/initial/redir#2] (2) init rewrite engine with requested uri /error_docs/forbidden.html
194.8.74.10 - - [11/May/2009:17:06:24 +0200] [forum.mydomain.de/sid#8238070][rid#84770a0/initial/redir#2] (3) applying pattern '^(.*)$' to uri '/error_docs/forbidden.html'
194.8.74.10 - - [11/May/2009:17:06:24 +0200] [forum.mydomain.de/sid#8238070][rid#84770a0/initial/redir#2] (4) RewriteCond: input='194.8.74.10' pattern='^194\.8\.74|75\.[0-9]+$' => matched
194.8.74.10 - - [11/May/2009:17:06:24 +0200] [forum.mydomain.de/sid#8238070][rid#84770a0/initial/redir#2] (2) forcing responsecode 403 for /error_docs/forbidden.html
... bis redir#10

Vielleicht fällt dazu ja noch jemand etwas ein?

Gruß, Titus
 
Vielleicht fällt dazu ja noch jemand etwas ein?
applying pattern '^(.*)$' to uri '/'


RegEx auf !^/error_docs/ abändern, s. oben. Warum der Stopp-Mechanismus nicht greift liegt wenn dann am Quellcode, da habe ich keine Zeit zum Nachschauen.

Das mit dem Deny habe ich schon versucht
[...]
Der Zugriff auf die Web-Application im Tomcat erfolgt aber trotzdem noch.
Im <Location />-Container?
 
Was passiert mit einem "ErrorDocument 403 default"? Dann bekommen die geblockten Besucher zwar keine hübsche Fehlermeldung aber das sollte in dem Fall zu verschmerzen sein ;)
 
Back
Top