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
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:
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.
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:
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.
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.
Tags und Links apache mod-rewrite