2016-06-28 7 views
-1

Bitte helfen Sie mir eine Lösung für dieses Verhalten zu finden, die mir sehr fremd ist.mod_rewrite Regel angepasst, aber Kette ist nicht

Hier ist meine .htaccess

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteRule  ^emltr\.gif$     aaa.html [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$       index.php [L,QSA] 
</IfModule> 

Notiere die L-Flag, so würde ich sagen, dass, wenn „gif“ Regel verglichen wird die Kette gelassen wird. Aber es ist nicht.

Die angeforderte URL ist „emltr.gif“

Wenn die „catch-all“ -Regel und Bedingungen kommentiert werden, dann ist die „gif“ Regel richtig gemacht. ("aaa.html" existiert nicht, dies ist ein Test, um unerwünschtes zirkuläres Verhalten zu verhindern.)

Wenn die "Catch-All" -Regel unkommentiert ist, dann wird IT genommen und nicht die erste Regel. Warum wird der zweite statt der erste genommen? Oder anders: Warum ist die Kette nicht verlassen, obwohl das L-Flag, und dann die zweite Regel ausgewertet wird?

Danke

+0

So funktioniert das L, es stoppt die Rewiteration. Sie können END anstelle von L verwenden, um den Neuschreibprozess sofort zu beenden, wenn die Regel übereinstimmt – starkeen

Antwort

1

Diese im Handbuch L|last dokumentiert

Der [L] Flag bewirkt, dass mod_rewrite Verarbeitung des Regelsatzes zu stoppen. In den meisten Kontexten bedeutet dies, dass wenn die Regel übereinstimmt, keine weiteren Regeln verarbeitet werden.

Wenn Sie RewriteRule entweder in .htaccess-Dateien oder in <Directory>-Abschnitten verwenden, ... Die vereinfachte Form davon ist, dass nach der Verarbeitung der Regeln die neu geschriebene Anforderung an die URL-Parsing-Engine zurückgegeben wird es darf damit sein. Es ist möglich, dass, wenn die umgeschriebene Anfrage bearbeitet wird, die .htaccess-Datei oder der Abschnitt erneut angetroffen werden kann und somit der Regelsatz von Anfang an erneut ausgeführt werden kann. In den meisten Fällen tritt dies auf, wenn eine der Regeln eine interne oder externe Umleitung verursacht, wodurch der Anforderungsprozess neu gestartet wird.

Ein alternatives Flag, [END], kann nicht nur zum Beenden der aktuellen Rewrite-Verarbeitung verwendet werden, sondern auch dazu, dass eine nachfolgende Rewrite-Verarbeitung in einem Kontext pro Verzeichnis (htaccess) verhindert wird. Dies gilt nicht für neue Anforderungen, die aus externen Weiterleitungen resultieren.

Kurz gesagt, wenn Sie Rewrite-Regeln in einer .htaccess-Datei oder in einer Directory Richtlinie wird die Anfrage erneut bearbeitet werden, wenn sie von dieser Runde neu geschrieben wurde. Nur wenn es nicht mehr neu geschrieben wird, wird es aufhören.

Verwandte Themen