mod_rewriteを使ってHTTPアクセスをHTTPSにリダイレクトする設定にしてあるページにBasic認証をかけている場合、なにも考えずに設定すると以下のようなことが起こる:
- 普通にHTTPでアクセス
- Basic認証が求められるが、この認証は暗号化されない
- 認証後HTTPSバージョンにリダイレクトされる
- 再度Basic認証が求められる (これは暗号化される)
つまり、以下2つの問題がある:
- 暗号化されない状態で認証情報が送信される
- 同じ認証動作が2度必要になる
これを解決する。
- HTTPによるアクセスは認証がない状態で認めるが、必ずHTTPS版にリダイレクトする
- HTTPSのアクセスは認証が必用
※最初に書いた方法では実はうまくいかないことが判明したので修正。
RewriteEngine on
# HTTPSのアクセスはリダイレクト不要なので無視
RewriteCond %{HTTPS} off
# LetsEncryptを使っている場合に、 /.well-known/* へのアクセスはリダイレクトしないようにする
# 設定するコンテクストによってパターンの記述が異なるはずなので注意が必要
RewriteRule ^\.well-known/* - [L]
# その他のアクセスはhttps://*にリダイレクト
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# HTTPSアクセスの場合のみ認証を求める
<If "%{HTTS} == 'on'">
# Basic認証
AuthType Basic
AuthName "www.example.com authentication"
AuthUserFile /path/to/passwd-file
Require valid-user
</If>
非常に有用な情報なのですが、
恐らくtypoと思われる記述がありましたので、
指摘させてください。
%{HTTS}→%{HTTPS}
↓