So leiten Sie den Datenverkehr auf http um

So leiten Sie den Datenverkehr auf http um

Ich habe einen Apache-Server unter einem Proxy, der HTTPS ausführen kann. Anstatt den Header HTTPS=on zu senden, sendet er HTTP_X_FORWARDED_PROTO=https.

Ich möchte eine .htaccess-Regel schreiben, die alle Anfragen von https auf http umleitet, sofern die URL nicht /user/login ist.

Mir sind ungefähr diese Zeilen eingefallen (die eine Endlosschleife erzeugen):

RewriteCond %{HTTP:http_x_forwarded_proto} !http
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Antwort1

Das Problem mit Ihrer Umleitungsregel ist wahrscheinlich, dass Sie das Präfix „http_“ duplizieren. Dies sollte nicht notwendig sein. Wenn Sie einen Reverse-Proxy vor Ihrem Server haben (z. B. F5 oder nginx), lautet der Header „X-Forwarded-Proto“ oder manchmal „X-Forwarded_Proto“. Um diese in einer Umschreiberegel zu referenzieren, verwenden Sie %{HTTP:Name-Of-Header} (Groß-/Kleinschreibung wird nicht beachtet).

Für die stabilste Umschreibung, die in allen Situationen funktioniert, verwenden Sie etwa Folgendes:

# Make sure all SSL pages for dot-com are redirected to HTTP.
RewriteCond %{SERVER_PORT} 443 [OR]
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} https [OR]
RewriteCond %{HTTP:X-Forwarded_Proto} https
RewriteRule (.*) http://%{HTTP_HOST}/$1 [R=301,L]

Weitere Einzelheiten zur Verwendung von Headern in RewriteCond finden Sie imApache mod_rewrite-Dokumentation.

Antwort2

Ich denke, das Problem mit Ihrer Anfangsbedingung ist, dass Sie !http statt !=http haben. Das könnte die Endlosschleife beheben.

    RewriteEngine On
    RewriteCond %{HTTP:http_x_forwarded_proto} !=http
    RewriteCond %{REQUEST_URI} !^/user/login.*
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Dies sollte jede HTTPS-Anfrage, die nicht /user/login ist, annehmen und in http umschreiben. Ich bin mir jedoch sicher, dass es eine elegantere Möglichkeit gibt, dies zu tun. Sie könnten beispielsweise RewriteCond %{HTTP:http_x_forwarded_proto} !=http entfernen und es würde wahrscheinlich genauso gut funktionieren, da es jede ihm übergebene Anfrage, die nicht /user/login enthält, annehmen und in http umleiten sollte.

verwandte Informationen