SSLやWWWリダイレクト設定があるとHTTPS(SSL)でのBASIC認証が上手くいかない

結論から言うと、.htaccessのRewriteRuleによるリダイレクトを設定しているとHTTPS接続でBASIC認証が効かない状態になるみたいです…
時代の流れに乗ってSSL化作業を済ませ、前の記事にて電車猫ブログのHTTPS化が完了したと書いたのに一件落着ではなかったですねorz

本題の前に、前提条件のお話を。

電車猫ブログのHTTPS化をしたのは良いのですが、HTTPでアクセスして来てもらっては常時SSL化とはならず、セキュリティ的なメリットが半減するわけですよ。
Google先生に聞いたところ、.htaccessのRewriteRuleでリダイレクトさせれば良いということが分かりました。
.htaccessでのリダイレクトの目的は2つあります。

  1. HTTPでアクセスした人をHTTPSの同じパスのページにリダイレクトさせる(常時SSL化の趣旨)
  2. www.traincat.netでアクセスしてもtraincat.netにアクセスさせる(SEO的な目的)

以下のページを参考に、.htaccessを書きました。

m630.net - httpからhttpsへのリダイレクトしてwwwありなしを統一する
デジ研 - 常時SSL導入の注意点とSSLページのインデックスまでにかかる時間 - HSTSを設定しましょう

.htaccessの内容は以下になります。

RewriteEngine on

# HTTPの場合のリダイレクト.
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# www.traincat.netの場合のリダイレクト
RewriteCond %{HTTP_HOST} ^(www\.traincat\.net)(:80)?
RewriteRule ^(.*) https://traincat.net/$1 [R=301,L]

# HSTSの設定
Header set Strict-Transport-Security "max-age=31536000" env=HTTPS

これによって、例えば
 http://traincat.net/foo/bar/
 http://www.traincat.net/foo/bar/
 https://www.traincat.net/foo/bar/
は最終的に以下のURLへリダイレクトされます。
 https://traincat.net/foo/bar/

HSTSにも対応することで、SSLに対応していることをブラウザや検索エンジンのクローラーに通知させます。
上記.htaccessをルートディレクトリに配置することでリダイレクトに対応できました。

ここからが本題になります。
上記.htaccessをアップロードした後、BASIC認証ありのページにアクセスし、動作検証を試みたところ、問答無用で403エラーになりました。
SSL化する前はアクセスできていましたし、以前の.htaccessファイルに戻したらBASIC認証ができるので、確実に今回の設定に問題がある訳ですね。
この問題を解決する為に日本語のサイトだけでは見つからず、Stack Overflowなどの海外サイトまで調べましたが、なかなか正解にたどり着けず、手間取りました。
しかし、結局日本語のソースで役に立ちそうなページを発見しました!

blog20100901 - [memo] .htaccess の RewriteRule で Basic 認証が効かない問題 (0x21e)

BASIC認証をかけている.htaccess(先ほどの.htaccessとは別ファイル)を修正することで対応できるようです。
赤字が追記箇所になります。

ErrorDocument 401 "Unauthorized Access"
RewriteEngine off

SSLRequireSSL
AuthUserFile /home/users/lovecats/hoge/basic-area/.htpasswd
AuthGroupFile /dev/null
AuthName "Password Required"
AuthType Basic
require valid-user
order deny,allow

詳しい内容は前述のブログに記載されているので、ざっくりと解説を。
BASIC認証とリダイレクト(RewriteRule)の相性は悪いようなので、RewriteEngineをoffにします。
ErrorDocument 401 "Unauthorized Access"があることで、HTTPSでもBASIC認証が効くようになるようです。
その代わり、上記で記載したリダイレクトは無効になりますが、制限ページの役割を考えるとSEO的なリダイレクトは気にしなくても大丈夫でしょう。
ただ、HTTPアクセスでBASIC認証ページに訪問されてしまうと、リダイレクトが無効になってるので、HTTPS化した意味がなくなってしまいます。それに対応する為に、HTTPS接続に限定する「SSLRequireSSL」を記述しました。
※なお「ErrorDocument 401 "Unauthorized Access"」の部分については、401エラー用のHTMLを用意できるのであれば、例えば「ErrorDocument 401 /error-pages/401.html」のようにしても良いと思います。「ErrorDocument 401 "Unauthorized Access"」の設定だと、BASIC認証に失敗した場合は「Unauthorized Access」と1行テキストが出力させるだけになります。

常時SSL化によりBASIC認証が無効になってしまったら、HTTPSとHTTPの共存もやむなしかと思っていたので、この様な逃げ道があって良かったです。
常時SSL化の流れになっている今後は同じ問題が発生することが多くなるのではないかなと思っていますので、ご参考になりましたら幸いです。