ヘテムルサーバーにて、独自ドメインで独自SSLの利用を始めました。
SSLはhttp://www.(ドメインは以下example.comとします)でインストールしました。
現在、困っているのは、
あるディレクトリ(/data)のみhttpと入力された場合、httpsにリダイレクトするように
したいのですが、(https://www.exmaple.com/data/~にURLを統一させる)
http://www.exmaple.com/data/~.html ⇒ https://www.~(略) ●成功
http://exmaple.com/data/~.html ⇒ https://www.~(略) ●成功
https://exmaple.com/data/~.html
⇒この場合はうまくリダイレクトせず証明書エラーになります。
以下、htaccessの内容です。
(https://example~の場合の振り分けはよく分からなかったので表記しておりません)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com [OR]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://www.example.com/data/$1 [R=301,L]
どのようにすればhttps://example~でもうまくリダイレクトできるのでしょうか?
上記の内容も色々調べて自分なりに書いてみたものですので、もしもっとよい書き方があれば教えてください。
よろしくお願いします。
条件が揃えば不可能では無いですが....。
そもそも、https://example.com の時に証明書のエラーになるのは、サーバから送られてくる証明書に記載されている FQDN と、つなごうとした URL に含まれる FQDN が合致しないためです。おそらく、証明書は www.example.com に対する証明書だと思いますが、「example.com」へつなごうとして、「www.example.com」の証明書が届いたので、エラーになっています。
これは、名前ベースのバーチャルホストの問題点として有名な話で、名前ベースのバーチャルホストでは、HTTP のやり取りの中で、クライアント側がなんという名前のサーバへアクセスしようとしているのかをサーバが把握しますが、SSL の場合は、その HTTP のやり取りより前に、証明書のやり取りなどの処理を行うため、証明書を渡す時点では、クライアントがつなごうとしたサーバ名が分からない、という問題があります。
今回の場合、https://example.com へ TCP レベルで接続した直後に SSL の処理が始まり、その段階でエラーになるので、Rewrite が作用する以前の段階でのエラーになります。
で、これを解決する手法としては、SNI という SSL/TLS の拡張機能があります。
Apacheの設定を変更し、単一IPアドレス上で複数のSSLサイトを運用する - builder
もし、Web サーバが SNI に対応していれば、
とします。具体的な設定は、下記のページが参考になると思います。
ウェブブラウザのSNI対応 | dodaの日記 | スラッシュドット・ジャパン
あと、ワイルドカード証明書を使う、ということも考えたのですが、「*.example.com」の証明書で 「example.com」は多分ダメじゃないかと。これが通るのなら、ワイルドカード証明書にするのがてっとり早いはずなのですが...。