2017-09-15 8 views
0

テストの目的で、私はパスワード保護されたウェブサイトのクローンを持っており、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]フラグを使用すると、認証前にリダイレクトが行われないのはなぜですか?

+0

あなたは「L」フラグを誤解しています。 'L'フラグはループ内で' continue'のようにしか動作しません。 'mod_rewrite'ループを強制的に実行させるだけです。認証は 'mod_auth_basic'を使用して行われます。これは' L'フラグとは完全に独立しています。 – anubhava

+0

ありがとう、@anubhava。ドキュメントから: "このフラグを使用すると、現在のルールをさらにルールを考慮せずにすぐに適用する必要があることを示します。私には、 '[L、R = 302]' -ruleがマッチしたときに直ちに302リダイレクトを実行し、リダイレクト後までauth-sectionに到達しないように思えますか? –

+0

authセクションは別のモジュールからのものであり、したがって 'L'フラグまたは任意の' mod_rewrite'フラグは実行を妨げません。 authセクションが 'mod_rewrite'モジュールの前に最初に実行されることもあります。 – anubhava

答えて

0

言ってドキュメントにもかかわらず、別のApacheモジュールが独立して動作し、[L]フラグが起こってから認証を妨げないようだUse this flag to indicate that the current rule should be applied immediately without considering further rules.

私は接続であることを確認 Ifディレクティブで認証をラップになってしまった

安全です。

接続が安全でない場合、認証は実行されず、要求はリダイレクトされます。リダイレクト後、接続は安全で認証が実行されます。

# Require authentication 
# If the connection is not secure, authentication is postponed 
<If "%{HTTPS} = 'on' || %{HTTP:X-Forwarded-Proto} = 'https'"> 
    AuthName "Restricted development environment" 
    AuthType Basic 
    AuthUserFile /var/www/html/.htpasswd 
    Require valid-user 
</If> 
関連する問題