web-dev-qa-db-ja.com

.htaccessを使用してSSLを適切に強制し、二重認証を行わない

共有ホストで.htaccessを使用してSSLを強制しようとしています。これは、メインのVirtualHost構成ではなく、.htaccessにのみアクセスできることを意味します。 VirtualHost構成ファイルにルールを設定してSSLを強制的に取得し(最初に処理し)、二重認証を防ぐことができることは知っていますが、それを実現することはできません。

ここに私が行った進歩があります:

構成1

これはかなりうまく機能しますが、http://example.comにアクセスすると二重認証を強制します。httpに1回、次にhttpsに1回です。ログインすると、http://example.com/page1.htmlがhttps coutnerpartに自動的にリダイレクトされます:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]


RewriteEngine on
RewriteCond %{HTTP_Host} !(^www\.example\.com*)$
RewriteRule (.*) https://www.example.com$1 [R=301,L]


AuthName "Locked"
AuthUserFile "/home/.htpasswd"
AuthType Basic
require valid-user

構成2

ファイルの先頭に次を追加すると、パスワードの入力を求める前にSSLに切り替わるという点で、はるかにうまく機能します。

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_Host} eq "example.com"
ErrorDocument 403 https://example.com

SSLRequireSSLオプションとErrorDocument 403を使用して安全なバージョンのサイトにリダイレクトする方法は賢明です。私の唯一の不満は、http://example.com/page1.htmlにアクセスしようとすると、https://example.com/にリダイレクトされることです。

したがって、ダブルログインなしでSSLを強制しますが、非SSLリソースを対応するSSLに適切に転送しません。

最初の設定については、Insyteが「mod_rewriteを使用して単純なリダイレクトを実行するのは少しやり過ぎです。代わりにRedirectディレクティブを使用してください。mod_rewriteルールは最後のファイルが実際にファイルシステムから取得される直前に処理されるディレクティブ "

私は、リダイレクトディレクティブを使用してforce-ssl configオプションを見つけることができなかったため、この理論をテストすることができませんでした。

6
cwd

Phpやcgiなどのサーバー側で実行している場合は、ErrorDocumentを認証を必要としないファイルに設定します。このファイルは、クライアントを適切な場所にリダイレクトする必要があります。 ApacheはいくつかのREDIRECT_-接頭辞付きの環境変数を設定し、元の環境を保持します- http://httpd.Apache.org/docs/trunk/custom-error.html を参照してください。

.htaccessで、上記の2番目の例のようにしますが、ErrorDocumentを内部ドキュメントにします。

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_Host} eq "example.com"
ErrorDocument 403 /err_redirect.php
AuthName "Locked"
AuthUserFile "/home/.htpasswd"
AuthType Basic
require valid-user
<Files /err_redirect.php>
  AuthType none
</Files>

次に、そのエラードキュメントで、適切なHTTPステータスとLocationヘッダーを送信します。 phpの簡単な例を示します。

<?php
    header("Location: https://" . $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
?>
6
user5244

これは私がやろうとしているものに最適です、私はリストした/admin//admin/.htaccessの下のそれぞれのディレクトリにいくつかのPHPベースの管理ツールを持っています:

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_Host} eq "www.example.com"
ErrorDocument 403 https://www.example.com/admin/

AuthName "Enter your credentials"
AuthType Basic
AuthUserFile /etc/httpd/passwd/passwordfile
Require user valid-user

セキュアでないexample.com/adminに行くと、セキュアなexample.com/adminにリダイレクトし、認証を求めます。

3
Sm0k3

私は同じ問題を抱えていましたが、今これを使用しています:

AuthType Basic
AuthName "Protected area"
# your auth provider setup here
Require expr "%{ENV:HTTPS} !~ /on/i"
Require valid-user

RewriteEngine On

# Redirect alias to preferred hostname  
RewriteCond expr "! %{HTTP_Host} -strmatch '%{SERVER_NAME}'"
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]

# Redirect http:// to https://
RewriteCond expr "%{ENV:HTTPS} !~ /on/i"
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

基本的に、http://が使用されている場合はアクセスを許可しますが、この場合はすべての要求をhttps://にリダイレクトします。

"%{ENV:HTTPS} !~ /on/i"を使用するのは、Apacheがhttp://を使用する場合のようにHTTPSを「オフ」に設定しないシステム、または「オン」ではなく「オン」に設定しないシステムがあるためです。 https://で。また、誰かが必要に応じて、SERVER_NAMEへのリダイレクトを追加しました。

すべてのレガシーエイリアスの証明書がないため、この場合は最初にデフォルトのホスト名にリダイレクトすることが不可欠です。

1
xsrf