共有ホストで.htaccess
を使用してSSLを強制しようとしています。これは、メインのVirtualHost
構成ではなく、.htaccess
にのみアクセスできることを意味します。 VirtualHost
構成ファイルにルールを設定してSSLを強制的に取得し(最初に処理し)、二重認証を防ぐことができることは知っていますが、それを実現することはできません。
ここに私が行った進歩があります:
これはかなりうまく機能しますが、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
ファイルの先頭に次を追加すると、パスワードの入力を求める前に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オプションを見つけることができなかったため、この理論をテストすることができませんでした。
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"]);
?>
これは私がやろうとしているものに最適です、私はリストした/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
にリダイレクトし、認証を求めます。
私は同じ問題を抱えていましたが、今これを使用しています:
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
へのリダイレクトを追加しました。
すべてのレガシーエイリアスの証明書がないため、この場合は最初にデフォルトのホスト名にリダイレクトすることが不可欠です。