
HTTPS を実行できるプロキシの下に Apache サーバーがあります。HTTPS=on ヘッダーを送信する代わりに、HTTP_X_FORWARDED_PROTO=https を送信します。
URL が /user/login でない限り、すべてのリクエストを https から http にリダイレクトする .htaccess ルールを記述したいと思います。
私が思いついたのは、次の行(無限ループを実行する)です。
RewriteCond %{HTTP:http_x_forwarded_proto} !http
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
答え1
リダイレクト ルールの問題は、おそらく「http_」プレフィックスが重複していることです。これは必要ありません。サーバーの前にリバース プロキシ (F5 や nginx など) がある場合、ヘッダーは「X-Forwarded-Proto」、または場合によっては「X-Forwarded_Proto」になります。書き換えルールでこれらを参照するには、%{HTTP:Name-Of-Header} (大文字と小文字は区別されません) を使用します。
あらゆる状況で機能する最も堅牢な書き換えを行うには、次のようなものを使用します。
# 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]
RewriteCondでのヘッダーの使用に関する詳細は、Apache mod_rewrite ドキュメント。
答え2
初期条件の問題は、!=http ではなく !http になっていることだと思います。これで無限ループが修正されるかもしれません。
RewriteEngine On
RewriteCond %{HTTP:http_x_forwarded_proto} !=http
RewriteCond %{REQUEST_URI} !^/user/login.*
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
これは、/user/login ではないすべての https リクエストを受け取り、それを http に書き換えます。ただし、これを行うにはもっとエレガントな方法があると思います。たとえば、RewriteCond %{HTTP:http_x_forwarded_proto} !=http を削除しても、おそらく同じように機能するでしょう。これは、/user/login を含まないすべてのリクエストを受け取り、それを http にリダイレクトするからです。