Apache mod_rewrite RewriteRule-Schleifen trotz L-Flag

Apache mod_rewrite RewriteRule-Schleifen trotz L-Flag

Apache/2.4.54.
Ich versuche zu erreichen, dass ähnliche URLs (z. B. "/irgendwas.htm") extern auf "/irgendwas" umgeleitet werden, was intern "irgendwas.html" ist. Aber die folgenden Regeln verursachen eine Schleife, anstatt anzuhalten, d. h. "irgendwas" wird gefunden

RewriteEngine On
RewriteBase /
RewriteRule ^something$ something.html [L]
RewriteRule ^(some|thing|any|stuff).*/?$ /something [L, R=301,NC]

Aber anscheinend hat die Direktive „L“ keine Wirkung, denn die Umleitung zu „/etwas“ wird erneut von der zweiten Regel ausgeführt, was zu einer Schleife führt.

Testen mithttps://htaccess.madewithlove.com/schlägt vor, dass es wie erwartet funktionieren sollte. Ich glaube nicht, dass ich die Protokollierung aktivieren kann :-(

Antwort1

Das LFlag stoppt nur den aktuellen Durchlauf durch die Rewrite-Engine, es stoppt nichtalleVerarbeitung. Die folgenden Anweisungen werden nicht sofort verarbeitet, aber (in einem Verzeichniskontext) beginnt der Umschreibvorgang dann von vorne... Während des „zweiten Durchgangs“ stimmt die erste Regel nicht mehr überein (da die Eingabe jetzt ist something.html), aber die zweite Regel stimmt überein und löst daher die Umleitung aus.

(Die Rewrite-Engine führt eine Schleife aus, bis die URL unverändert durchgeht. Die Anweisungen sind leichter zu verstehen, wenn sie in einemServer(Nicht-Verzeichnis-)Kontext, in dem das LFlag tatsächlich die gesamte Verarbeitung stoppt, da nur ein einziger Durchlauf durch die Umschreibe-Engine erfolgt.)

Unter Apache 2.4 können Sie jedoch ENDstattdessen das Flag verwenden, um die gesamte Verarbeitung durch die Rewrite-Engine zu stoppen (in einemVerzeichnisKontext). Beispiel:

RewriteEngine On

RewriteRule ^something$ something.html [END]
RewriteRule ^(some|thing|any|stuff) /something [R=301,NC,L]

(Beachten Sie, dass Sie eine fehlerhafteRaumim Flag-Argument der zweiten Regel. Dies hätte zu einem Analysefehler geführt, daher gehe ich davon aus, dass dies ein Tippfehler in Ihrer Frage war?)

Der nachstehende reguläre Ausdruck in der zweiten Regel (z. B. .*/?$) ist überflüssig.

Die Verwendung Lmit einer Umleitung ( RFlag) ist dasselbe wie END. Die gesamte Verarbeitung wird gestoppt.

Die RewriteBaseDirektive ist in Deinem Beispiel überflüssig.

NB: Sie sollten zunächst mit einer 302-Weiterleitung (vorübergehend) testen und erst dann auf eine 301-Weiterleitung (permanent) umstellen, wenn Sie sicher sind, dass dies wie vorgesehen funktioniert. 301-Weiterleitungen werden vom Browser dauerhaft zwischengespeichert, was das Testen problematisch machen kann. Daher müssen Sie vor dem Testen den Browser-Cache (und alle Zwischenspeicher) leeren.

Tests mit https://htaccess.madewithlove.com/lassen darauf schließen, dass es wie erwartet funktionieren sollte.

Anders als ein echter Server führt der MWL-Tester die Regeln (tatsächlich) nur „einen einzigen Durchlauf“ durch und kann daher keine Umschreibe-/Umleitungsschleifen erkennen.


Beiseite:Normalerweise sollten Sie externe Umleitungsanweisungen vor internen Umschreibungen anordnen. Die zweite Regel in IhremBeispielwürde auf sich selbst umleiten /something, sodass Ihre beiden Anweisungen derzeit von der Reihenfolge abhängen, in der Sie sie haben.

verwandte Informationen