Ich habe einige mod_rewrite
-Regeln in einer .htaccess
-Datei definiert, eine, um den URL-Pfad von /rwtest/source.html
in /rwtest/target.html
umzuschreiben, und eine weitere, um den direkten Zugriff auf /rwtest/target.html
zu verbieten. Das heißt, alle Benutzer, die den Inhalt von /rwtest/target.html
sehen möchten, müssen /rwtest/source.html
in ihre URL-Leiste eingeben.
Ich habe versucht, das Flag NS
in der Regel verbieten zu verwenden, um zu verhindern, dass umgeschriebene URLs ebenfalls abgelehnt werden, aber es scheint, dass dieses Flag nicht zwischen der ersten Anfrage und der internen Umleitung unterscheidet. Es scheint, dass NS
die Arbeit machen sollte, aber ich bin mir sicher, dass ich etwas falsch verstehe.
Kann jemand bitte dieses Verhalten erklären? Was genau macht diese interne Weiterleitung nicht zu einer internen Unteranfrage, die das NS
-Flag ignorieren kann?
Hier ist meine vollständige .htaccess
-Datei:
Ich verwende Apache 2.4.9 unter Windows 7 x64, aber ich habe ähnliches Verhalten bei Apache 2.4.3 unter Linux beobachtet. Hier ist Log-Ausgabe für eine Anfrage an /rwtest/source.html
.
Ich habe einige Problemumgehungen unten gepostet.
Dafür gibt es mehrere Problemumgehungen, die jeweils Vor- und Nachteile haben. Als Haftungsausschluss habe ich sie nur in .htaccess
Kontext getestet.
Fügen Sie RewriteCond
hinzu, um zu prüfen, ob %{ENV:REDIRECT_STATUS}
leer ist. Wenn es leer ist, ist die aktuelle Anfrage keine interne Weiterleitung.
Mangel an Dokumentation. Auf der Seite Benutzerdefinierte Fehlerantworten wird diese Variable kurz erwähnt:
REDIRECT_
Umgebungsvariablen werden aus den Umgebungsvariablen erstellt, die vor der Umleitung existierten. Sie werden mit dem PräfixREDIRECT_
umbenannt, d. H.% Co_de% wirdHTTP_USER_AGENT
.REDIRECT_HTTP_USER_AGENT
,REDIRECT_URL
undREDIRECT_STATUS
werden garantiert gesetzt, und die anderen Header werden nur gesetzt, wenn sie vor der Fehlerbedingung existierten.
Ich habe jede andere REDIRECT_QUERY_STRING
Variable in REDIRECT_
ausprobiert, aber alle außer RewriteCond
waren leer für interne Weiterleitungen. Warum REDIRECT_STATUS
ist das Besondere in REDIRECT_STATUS
bleibt ein Geheimnis.
Credits für diesen Ansatz gehen zu URL rewrite: interner Serverfehler .
Im Gegensatz zum mod_rewrite
-Flag hält L
die Umschreibregeln selbst für interne Umleitungen an.
Weitere Informationen finden Sie unter END-Flag .
END
Die vollständige HTTP-Anforderungszeile, die vom Browser an den Server gesendet wird (z. B. "GET /index.html HTTP / 1.1").
%{THE_REQUEST}
ändert sich nicht mit internen Weiterleitungen, so dass Sie dagegen abgleichen können.
Wesentlich komplizierter als die anderen Ansätze. Erzwingt die Verwendung von THE_REQUEST
, wobei nur ein RewriteCond
ausreichend gewesen wäre.
Entspricht der vollständigen URL, die im Gegensatz zu den meisten anderen Variablen nicht entkoppelt (dekodiert) wurde.
Unbequem in mehreren RewriteRule
s zu verwenden. RewriteRule
s kann über jedes RewriteCond
kopiert werden oder der Wert kann in eine Umgebungsvariable exportiert werden (siehe Beispiel). Beide hacky Alternativen.
Oder exportieren Sie den Pfad zu einer Umgebungsvariablen und verwenden Sie ihn in mehreren RewriteRule
s.
Tags und Links apache url-rewriting mod-rewrite