Interne Weiterleitungen von mod_rewrite mit NS-Flag können nicht ignoriert werden

9

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?

Details:

Hier ist meine vollständige .htaccess -Datei:

%Vor%

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 .

%Vor%

Problemumgehungen

Ich habe einige Problemumgehungen unten gepostet.

    
mksios 17.06.2014, 08:19
quelle

1 Antwort

10

Dafür gibt es mehrere Problemumgehungen, die jeweils Vor- und Nachteile haben. Als Haftungsausschluss habe ich sie nur in .htaccess Kontext getestet.

Workaround 1. Überprüfen Sie, ob REDIRECT_STATUS

leer ist

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.

Vorteile

  • Der direkteste Weg zur Bestimmung der internen Weiterleitung.

Nachteile

  • 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äfix REDIRECT_ umbenannt, d. H.% Co_de% wird HTTP_USER_AGENT . REDIRECT_HTTP_USER_AGENT , REDIRECT_URL und REDIRECT_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.

Beispiel

%Vor%

Credits für diesen Ansatz gehen zu URL rewrite: interner Serverfehler .

Problemumgehung 2. Bearbeiten Sie die Regelverarbeitung mit END

Im Gegensatz zum mod_rewrite -Flag hält L die Umschreibregeln selbst für interne Umleitungen an.

Vorteile

  • Einfach. Nur eine extra Flagge.

Nachteile

  • Gibt Ihnen nicht genügend Kontrolle darüber, welche Regeln zu verarbeiten sind und welche zu überspringen sind.

Beispiel

%Vor%

Weitere Informationen finden Sie unter END-Flag .

Workaround 3. Abgleich mit der ursprünglichen URL in THE_REQUEST

  

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.

Vorteile

  • Kann auch in der zweiten Runde der URL-Verarbeitung zur Übereinstimmung mit der ursprünglichen URL verwendet werden.

Nachteile

  • 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.

Beispiel

%Vor%

Oder exportieren Sie den Pfad zu einer Umgebungsvariablen und verwenden Sie ihn in mehreren RewriteRule s.

%Vor%     
mksios 17.06.2014, 08:19
quelle