テストの目的で、私はパスワード保護されたウェブサイトのクローンを持っており、dev.example.com
のようなサブドメインを使ってアクセスできます。私はbasic authentication
を使用しており、すべてのトラフィックはhttps
を使用して転送する必要があります。したがって、http
を使用するすべてのリクエストは、認証前にhttps
にリダイレクトする必要があります。私は次のファイル.htaccess
を試しました。Lフラグを使用するときに認証前にリダイレクトが行われないのはなぜですか?
RewriteEngine On
# Rewrite any requests to ip addresses or *.example.com to dev.example.com
RewriteCond %{HTTP_HOST} !^dev\.example\.com$ [NC]
RewriteCond %{THE_REQUEST} \s(\S*)\s
RewriteRule^https://dev.example.com%1 [L,NE,R=302]
# Rewrite to https
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]
# Require authentication
AuthName "Restricted development environment"
AuthType Basic
AuthUserFile /var/www/html/.htpasswd
Require valid-user
私は、クライアントがサーバーに直接接続している場合の両方をサポートするために%{HTTPS}
と%{HTTP:X-Forwarded-Proto}
の両方をチェックし、また、サーバはロードバランサの背後にある場合、ロードバランサの間のトラフィックだし、サーバーはhttp
を使用しています。
考えてみると、[L]
flagは認証前にリダイレクトが発生するはずですが、これは当てはまりません。 http://dev.example.com
にアクセスすると、認証がポップアップします。資格情報を正しく入力すると、https://dev.example.com
にリダイレクトされ、認証が再びポップアップします。
これは、フラグが使用されていないquestionです。推奨される解決策は、https
が使用されているときに環境変数を設定し、その変数が設定されているときにのみアクセスを許可することです。しかし、なぜ私は代わりに[L]
フラグを使うことができないのか分かりません。たぶん、私はそれがその使用と意味を誤解しています。 [L]
フラグを使用すると、認証前にリダイレクトが行われないのはなぜですか?
あなたは「L」フラグを誤解しています。 'L'フラグはループ内で' continue'のようにしか動作しません。 'mod_rewrite'ループを強制的に実行させるだけです。認証は 'mod_auth_basic'を使用して行われます。これは' L'フラグとは完全に独立しています。 – anubhava
ありがとう、@anubhava。ドキュメントから: "このフラグを使用すると、現在のルールをさらにルールを考慮せずにすぐに適用する必要があることを示します。私には、 '[L、R = 302]' -ruleがマッチしたときに直ちに302リダイレクトを実行し、リダイレクト後までauth-sectionに到達しないように思えますか? –
authセクションは別のモジュールからのものであり、したがって 'L'フラグまたは任意の' mod_rewrite'フラグは実行を妨げません。 authセクションが 'mod_rewrite'モジュールの前に最初に実行されることもあります。 – anubhava