Apacheのmod_rewriteを使用してhttpアクセスをhttpsへ強制的にリダイレクトするという手順は色々情報は出回っているようですが、Virtualhost環境にて複数サイトを運用している場合の手順があまり見つからなかったので残しておきます。
- httpd v2.4.6-40
- グローバルIPは一つで回すNameVirtualhost
- サイトAのドメイン名はexample1.com
- サイトBのドメイン名はexample2.net
- 両サイトともにSSL証明書は取得済み(秘密鍵は共用)
- ポート80番(http)、ポート443番(https)それぞれでリスンしていること
用意する設定ファイルは3つ。メインのhttpd.confに書いても問題はありませんが、設定ごとに分けておいたほうが後々便利です。
- /etc/httpd/conf.d/virtualhost-00.conf ※大元のバーチャルホスト定義
- /etc/httpd/conf.d/virtualhost-example1.com.conf ※example1.comのバーチャルホスト定義
- /etc/httpd/conf.d/virtualhost-example2.net.conf ※example2.netのバーチャルホスト定義
ではそれぞれ見てみます。
■/etc/httpd/conf.d/virtualhost-00.conf
<VirtualHost *:80> RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^/(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] </VirtualHost> <VirtualHost _default_:443> ServerName any <Location /> Require all denied </Location> </VirtualHost>
ポイントとなるのは「RewriteCond」と「RewriteRule」で、
https通信でなければ ⇒ %{HTTPS} off
https通信に書き換えてリダイレクト ⇒ ^/(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
ということになります。
二つ目のディレクティブは、バーチャルホストとして定義されていないServerName(例えばIPアドレスなど)でのアクセスは拒否するというものです。
■/etc/httpd/conf.d/virtualhost-example1.com.conf
SSLPassPhraseDialog exec:/etc/ssl/certs/pass_ssl.sh <VirtualHost *:443> SSLEngine on SSLProtocol all -SSLv2 SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key SSLCertificateChainFile /etc/httpd/conf/ssl.crt/internal.crt SSLCertificateFile /etc/httpd/conf/ssl.crt/example1.com.crt DocumentRoot /var/www/html/example1.com ServerName example1.com:443 AddDefaultCharset UTF-8 <Directory "/var/www/html/example1.com/"> Options Indexes FollowSymLinks </Directory> </VirtualHost>
■/etc/httpd/conf.d/virtualhost-example2.net.conf
SSLPassPhraseDialog exec:/etc/ssl/certs/pass_ssl.sh <VirtualHost *:443> SSLEngine on SSLProtocol all -SSLv2 SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key SSLCertificateChainFile /etc/httpd/conf/ssl.crt/internal.crt SSLCertificateFile /etc/httpd/conf/ssl.crt/example2.net.crt DocumentRoot /var/www/html/example2.net ServerName example2.net:443 AddDefaultCharset UTF-8 <Directory "/var/www/html/example2.net/"> Options Indexes FollowSymLinks </Directory> </VirtualHost>
各バーチャルホストサイトの個別設定は特に特記事項はありません。ドメインが異なるのでそれぞれ証明書を取得し、ドキュメントルートを分けているというだけのものです(※ただし秘密鍵は共用です)
要するに個別バーチャルホスト設定にはリダイレクトの設定は入れてない、ということです。