
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 L
Flag 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 L
Flag tatsächlich die gesamte Verarbeitung stoppt, da nur ein einziger Durchlauf durch die Umschreibe-Engine erfolgt.)
Unter Apache 2.4 können Sie jedoch END
stattdessen 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 L
mit einer Umleitung ( R
Flag) ist dasselbe wie END
. Die gesamte Verarbeitung wird gestoppt.
Die RewriteBase
Direktive 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.