8 Stimmen

mod_rewrite-Schleifen auch mit L-Flag

Ich habe ein Problem mit dem Umschreiben einer URL zu einem fastcgi Dispatcher. Wenn ich nur verlassen:

RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA]

Ich erwartete L (letzte Regel), um nur eine einzige Umschreibung vorzunehmen. Stattdessen wird weiterhin vorangestellt dispatch.fcgi bis Apache einen Fehler meldet.

Ich weiß, dass es mit behoben werden kann:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA]

Aber was ist der Grund für die mehrfache Umschreibung? Ist L etwas anderes tun, als ich glaube, dass es das tut?

13voto

Denes Papp Punkte 3551

Ich weiß, es ist eine alte Frage, aber für andere, die nach dem Echte Antwort hier ist sie:

El [L] Flagge DOES Arbeit in .htaccess Dateien. Sie sagt dem rewrite module um alle folgenden Regeln in diesem Bereich zu überspringen .htaccess Datei. Sie erledigt ihre Aufgabe, der Apache schreibt die URL um und beendet die .htaccess Datei.

Doch am Ende der .htaccess Datei wenn die URL der Anfrage umgeschrieben wurde, beginnt der gesamte Prozess des URL-Abgleichs erneut mit der neuen URL .

Genau das geschieht oben, ^(.*)$ se immer übereinstimmen die aktuelle URL, führt dies zu einer Endlosschleife, nur die maxredirect Rewrite-Option (standardmäßig 10) verhindert dies.

El !-f Dateiattribut-Test (wie vom Fragesteller erwähnt) würde das Problem zu lösen , da die URL mit einem echten Dateinamen übereinstimmen wird:

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA]

nun, wenn wir beantragen http://example.com/toappend , .htaccess schreibt es um in dispatch.fcgi/toappend et keine Umschreibeschleife passieren wird.

0 Stimmen

Warum ist es so, dass, wenn ich rewriterule .* /index.php gibt es eine Endlosschleife, doch wenn ich rewriterule .* index.php es keine Schleife gibt?

0 Stimmen

Ok, ich habe die Antwort gefunden und aufgeschrieben und hier verlinkt

5voto

pufos Punkte 2772

Hy , fügen Sie dies nach RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

und es sollte funktionieren, Schleifen zu stoppen.

1voto

Erik Punkte 20180

Anscheinend - und das habe ich nur hier gelesen, ich weiß es nicht aus erster Hand - funktioniert die [L]-Direktive nicht in .htaccess-Dateien, nur wenn sie in der .conf-Datei steht.

Siehe: Versteckte Funktionen von mod_rewrite

innerhalb des .htaccess-Kontextes, wird [L] mod_rewrite nicht zum Anhalten zwingen. es wird löst weiterhin interne

0 Stimmen

Ich denke, das beantwortet stackoverflow.com/questions/1775877 auch - leider war die richtige Antwort dort nicht vermerkt...

0voto

CamaroSS Punkte 453

Ich stand vor dem gleichen Problem, und es stellte sich heraus, dass die beste Lösung in Apache 2.3.9+ die Verwendung von ENDE Flagge anstelle von L da sie verhindert, dass mod_rewrite eine Schleife über die Regeln zieht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X