Wie kann ich mod_rewrite nur einmal mit einer Regel vergleichen?

7

Ich habe die folgende URL ...

Ссылка

... das ich in folgendes konvertieren möchte:

Ссылка

Ich dachte, ich könnte dies mit der folgenden Regel erreichen:

%Vor%

Ich finde jedoch, dass diese Regel wiederholt angewendet wird, was zu einem internen Serverfehler führt. Ich verstehe, dass, wenn der URI mit dieser Regel transformiert wird, der resultierende URI auch der Regel entspricht und daher erneut ad-infinitum angewendet wird.

Mein vorheriges (zugegebenermaßen etwas verschwommenes) Verständnis war, dass das [L] -Flag die weitere Verarbeitung stoppen würde, obwohl ich jetzt verstehe, dass dies nur bedeutet, dass nur die restlichen Regeln übersprungen werden und die Engine zum Umschreiben nicht stoppt die Regeln wieder.

Ich kann dieses Problem beheben, indem ich folgende Bedingung hinzufüge ...

%Vor%

... oder indem Sie einen spezifischeren regulären Ausdruck schreiben. Aber was ich wirklich tun möchte, ist eine Möglichkeit zu finden, die Rewrite-Engine daran zu hindern, weitere Übereinstimmungen zu versuchen, sobald diese Regel einmal gefunden wurde. Ist das möglich?

Vielen Dank.

    
James Smith 14.06.2011, 10:36
quelle

2 Antworten

16

Normalerweise werden 2 Methoden verwendet.

Die erste ist eine Rewrite-Bedingung, die testet, dass die angeforderte Datei keine echte Datei ist. Wenn interne Rekursion auftritt, ist Ihre php / blog.php eine echte Datei und der rewriterule wird nicht zum zweiten Mal ausgeführt. Nebeneffekt ist, dass jede Anfrage für eine Datei, die existiert, nicht neu geschrieben wird (was eine gute Nebenwirkung sein kann)

%Vor%

Die zweite Lösung besteht darin, zu überprüfen, dass Sie sich nicht in einer internen Umleitung befinden:

%Vor%

Nebeneffekt dieser zweiten Lösung ist, dass die rewriteRule nicht angewendet werden kann, wenn vorher andere Regeln angewendet wurden (wenn Sie eine interne Umleitung nach einem ersten Durchlauf des Neuschreibens tatsächlich ausführen möchten).

Bearbeiten

Zum Abschluss werde ich eine dritte Methode hinzufügen: das [NS] - oder [nosubreq] -Tag scheint dasselbe zu tun. Verhindern der Regelverwendung nach einer internen Umleitung

    
regilero 14.06.2011 11:36
quelle
4

Und die dritte Methode besteht darin, Apache auf 2.3.9 oder höher zu aktualisieren und das [END] -Flag anstelle von [L] zu verwenden.

Keine Nebenwirkungen

    
Andrew 06.08.2013 12:47
quelle

Tags und Links