Mod_Rewrite unerwartetes Verhalten L Flag

7

Meine Webanwendungsstruktur ist:

%Vor%

Der virtuelle Host ist wie folgt konfiguriert:

%Vor%

In /var/www/myapp/www/.htaccess gibt es:

%Vor%

Nun, wenn ich www.example.org anrufe, werde ich korrekt zu index.php umgeleitet, aber wenn ich www.example.org/css anrufe, werde ich immer noch zu index.php weitergeleitet.

Wenn ich die Zeile "RewriteRule. * index.php" ablege und dann www.example.org/css aufruft, werde ich korrekt zu css.php weitergeleitet.

Was ist los? Danke allen sehr.

======== EDIT =========

%Vor%

Scheint so, als ob eine erste Weiterleitung stattfindet, aber die mod_rewrite hört nicht auf, eine interne Weiterleitung zu verursachen. Dann wird die geänderte URL zu einem anderen Zeitpunkt an mod_rewrite übergeben, und es erfolgte eine zweite Umleitung, die nun der zweiten Regel entspricht.

Ich kann es nicht verstehen, weil ich das [L] Flag gesetzt habe, nur um sicherzustellen, dass der mod_rewrite stoppt.

Danke ein andermal

    
MaCi 14.07.2012, 14:58
quelle

2 Antworten

36

Sie vermissen eine wichtige Tatsache über das L -Flag :

  

Es ist daher wichtig, wenn Sie RewriteRule Anweisungen in einem verwenden von diesen Kontexten [ .htaccess , <Directory> ], nehmen Sie explizite Schritte vor, um das Schleifen von Regeln zu vermeiden, und zählen nicht nur auf das [L] -Flag, um die Ausführung einer Reihe von Regeln zu beenden p>

Von: L | last (Flag) ; fett von mir

Das bedeutet, dass nur die Verwendung von L nicht den gewünschten Effekt hat, um die interne Weiterleitung zu verhindern. Das INTERNAL REDIRECT passiert hier, weil es geschehen muss, Sie haben es mit Ihrer .htaccess Konfiguration angegeben. Das L -Flag ist nicht das richtige Flag, um das INTERNAL REDIRECT zu verhindern.

Sehen wir uns Ihre Frage näher an und was tatsächlich passiert:

  

Ich kann es nicht verstehen, weil ich das [L] Flag gesetzt habe, nur um sicherzustellen, dass der mod_rewrite stoppt.

Stimmt nur, dass Sie die Flagge L falsch erkannt haben. Es wird nur für das aktuelle Umschreiben anhalten, das heißt, die RewriteRule -Direktiven darunter werden in der aktuellen Runde (der inneren Schleife) nicht verarbeitet.

Wenn der URI geändert wurde, wird L erneut in die nächste Runde (die äußere Schleife) injizieren, wie im Folgenden beschrieben: technische Details Flussdiagramm zeigt:

Um hervorzuheben, wo die L -Flagge ankommt und wo die INTERNAL REDIRECT passiert, ist dies die gleiche Grafik mit einigen Anmerkungen für Ihre spezifische (erste) URI-Neufassung:

Es zeigt, dass das Flag L nur die innere Schleife verlässt, aber wenn die URI neu geschrieben (geändert) wurde - wie in Ihrem Fall - sorgt die äußere Schleife dafür, dass der geänderte URI erneut übergeben wird auf alle Ihre Rewrite-Regeln.

Stattdessen möchten Sie vielleicht eine Bedingung formulieren, wie das folgende Beispiel aus diesem Teil des Handbuchs zeigt:

%Vor%

( PT hat einen eigenen manuellen Eintrag , ist mehr oder weniger) nicht Teil der Lösung, nur noting, weil ich das Beispiel as-is zitiert)

Was Sie eigentlich verwenden möchten, ist das END Flag:

%Vor%

Wenden Sie sich jedoch an Ihren Systemadministrator, wenn Sie die erforderliche Apache-Version dafür haben (verfügbar in 2.3.9 und höher). Wenn nicht, müssen Sie mit RewriteCond arbeiten.

    
hakre 24.08.2012, 09:14
quelle
2

hakres Antwort zeigt gut, was passiert. Neben dem END Flag gibt es noch ein paar Optionen:

  • Verwenden Sie %{ENV:REDIRECT_STATUS} , um weitere Umschreibungen zu verhindern. Dies wird sich nach einer internen Weiterleitung ändern. Siehe diese Seite , um weitere Informationen zu erhalten, was tatsächlich geschieht:

    %Vor%
  • Verwenden Sie %{THE_REQUEST} , um mit der Anforderung übereinzustimmen, die an den Server gestellt wurde. Da sich dies bei einer internen Weiterleitung nicht ändert, kann dies dazu verwendet werden, weitere Weiterleitungen zu verhindern.

    %Vor%
  • Verwenden Sie eine Dummy-Variable in der Abfragezeichenfolge. Dies würde eine Umleitung verhindern, indem diese Variable in einer Verbindung definiert wird, aber wir werden sie hier verwenden, um mehrere Durchläufe zu verhindern:

    %Vor%

Bitte beachten Sie, dass Sie für jedes dieser Beispiele diese Konstruktion für jede einzelne Regel verwenden müssen.

    
Sumurai8 25.08.2014 06:27
quelle

Tags und Links