7

は:)のApache 2.2、その後*認証を行う* SSLにリダイレクトする(溶液で<?それはがらくたさ)

年齢古い問題になるので、ここではApacheのための場所であるように思わ:私はHTTP-をリダイレクトどのように>をHTTPSの場合は、HTTPSの場合のみ認証を行いますか?

ああ - と私は

...含める-EDをすることができ、複数の<ディレクトリ>または<場所>ブロックに単一のスニペット、そういない仮想ホストレベルのランダムなパスベースの書き換えで、そのほとんどたいと思います

さて、ここで私はそれが動作するようには思えんしているものです:

をバーチャルホストの上でブロックする

# Set ssl_off environment variable 
RewriteEngine on 
RewriteCond %{HTTPS} =on 
RewriteRule^- [E=ssl] 

場所またはディレクトリブロックで

RewriteEngine on 
# Case 1 redirect port 80 SSL 
RewriteCond %{HTTPS} !=on 
RewriteCond %{SERVER_PORT} =80 
RewriteRule^https://%{SERVER_NAME}%{REQUEST_URI} [R=301] 

AuthType Basic 
AuthBasicProvider external 
AuthExternal auth_pam 
AuthName "My Underpants" 
AuthzUnixgroup on 
Order Deny,Allow 
Deny from all 
Allow from env=!ssl 
Satisfy any 
Require group nice-users 

プラス

そのバーのすべてのを必要とするが、それは修正され、それぞれの場所に1行に含めるスニペットファイルに

を抽象化することができます各場所でSSLと認証を一緒に強制するので、間違いの可能性は低くなります。

マイナス

血まみれの地獄、それは直感的ではありません!私が知っているすべてのために壊れやすいかもしれません...

良い方法がありますか?表現した場合、Apacheは、一般的な

<で賢明な設定構文を持っていた場合

コメントはそれがどんな重大な欠陥を持っているかどうかに非常に歓迎されるでしょう:)

別に 人生はそんなに容易になるだろう> </If >

ブロックはどこでも使用できます。 IfModuleなどの特別なケースブロックがあり、RewriteCondのような特別な条件付きの条件があります(それに慣れていないとgrokを実行するのは非常に難しい)。

乾杯、

ティム

+0

VHのSSLと非SSLの管理は不要ですか? – regilero

+0

Apache 2.4への移行が可能な場合は、この問題の解決策があります。http://stackoverflow.com/a/26155051/762028 – Molomby

+0

[Apache .htaccessをHTTPSにリダイレクトしてからユーザー認証を要求する] (https://stackoverflow.com/questions/10267102/apache-htaccess-redirect-to-https-before-asking-for-user-authentication) – LWC

答えて

3

あなたがhttpsにサイト全体を強制したい場合は、あなたがのVirtualHostディレクティブを使用することができ、そしてそれは非常に簡単です:

<VirtualHost *:80> 
    ServerName example.com 

    RedirectMatch (.*) https://example.com$1 

</VirtualHost> 

<VirtualHost *:443> 
    ServerName example.com 

    ... 
    ... 
    ... 
</VirtualHost> 
+0

シンプルで効果的! – aland

-1

私はあなたのソリューションをテストしたが、うまくいかなかった...

私はSSLRequireSSLErrorDocument 403を使用して、JavaScriptコードを含む静的ページを構成しました。(ありがとうございました。ありがとうございました。 this blog page)。 /etc/apache2/conf.d.opt/redirect_if_not_https.conf

SSLRequireSSL 
ErrorDocument 403 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\ 
<html><head>\ 
<title>403 Forbidden</title>\ 
<script language=\"JavaScript\">\ 
window.location='https://'+window.location.hostname+window.location.pathname;\ 
</script>\ 
</head><body>\ 
<h1>Forbidden</h1>\ 
<p>You don't have permission to access that resource using simple HTTP. Please use HTTPS instead.</p>\ 
</body></html>" 

(私は/etc/apache2/conf.d.opt/を作成したことに注意してください)

とアプリconfの中に、(/etc/apache2/conf.d/trac.conf中など)、そのファイルが含まれています

<LocationMatch "/trac"> 
    # All the classical configurations here 
    # ... 

    Include conf.d.opt/redirect_if_not_https.conf 
</LocationMatch> 
+0

これは私のためには機能しませんでした。ページはまだhttpの基本認証を試みます。 – sonofagun

+0

それは私のために働いていましたが、どのOSでそれをしようとしていますか? –

+0

Scientific Linux。 – sonofagun

2

ティム・ワッツ'ソリューションは私のためにはうまくいくようだが、ちょっとした調整が必要だった。また、私の状況はHTTP認証なしで特定のIPアドレスを許可したいという点で若干異なりますが、余分な行が追加されます。

mod_rewriteはデフォルトでVirtualHostからconfigを継承しません。

参照:http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteoptions

私は「RewriteOptionsが継承」を利用するつもりだったが、これは子供のものAFTER親ルールが適用されているようです。いずれにせよ、私は別の解決策を考えました。リクエストURIはスラッシュが含まれている場合これはusing_ssl環境変数を設定します

SetEnvIf Request_URI "/" using_ssl=yes 

それは私のようにハックのビットです:私のSSL <のVirtualHost >以内

私はラインを持っている(つまり、すべての時間を。)最も初期の要求処理ディレクティブが実行された後、このディレクティブによって設定された内部環境変数は、アクセス制御とURIツーファイル名のマッピングとして、設定されている

:「を無条件するSetEnvを使用することを好むが、明らかにdが。設定している環境変数がRewriteRuleなどの処理の初期段階に入力されている場合は、代わりにSetEnvIfを使用して環境変数を設定する必要があります。

(ソース:http://httpd.apache.org/docs/2.2/mod/mod_env.html#setenv

私のコンテナ内の私の設定次のようになります。あなたは、おそらく最初のための代わりに 'R =パーマ' の単に 'R' で試してみたい

# Require a basic HTTP auth user 
AuthName "realm-name-goes-here" 
AuthType Basic 
AuthUserFile /var/www/etc/htpasswd 
Require valid-user 

# OR allow from non-SSL (which will be redirected due to mod_rewrite below!) 
Order Allow,Deny 
Allow from env=!using_ssl 

# OR allow from a trusted IP range 
# NB: This allows certain IPs without a username & password 
Allow from 192.168.0.0/16 

Satisfy Any 

# Force a redirect to HTTPS 
RewriteEngine On 
RewriteCond %{HTTPS} !=on 
RewriteRule^https://%{SERVER_NAME}%{REQUEST_URI} [L,R=permanent] 

テスト目的。

これは他の人にとって役に立ちます。

関連する問題