httpアクセスをhttpsへ強制リダイレクト(Virtualhost環境下での個別設定)

Linux

Apacheのmod_rewriteを使用してhttpアクセスをhttpsへ強制的にリダイレクトするという手順は色々情報は出回っているようですが、Virtualhost環境にて複数サイトを運用している場合の手順があまり見つからなかったので残しておきます。

各種前提条件
  1. httpd v2.4.6-40
  2. グローバルIPは一つで回すNameVirtualhost
  3. サイトAのドメイン名はexample1.com
  4. サイトBのドメイン名はexample2.net
  5. 両サイトともにSSL証明書は取得済み(秘密鍵は共用)
  6. ポート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>

 

各バーチャルホストサイトの個別設定は特に特記事項はありません。ドメインが異なるのでそれぞれ証明書を取得し、ドキュメントルートを分けているというだけのものです(※ただし秘密鍵は共用です)

要するに個別バーチャルホスト設定にはリダイレクトの設定は入れてない、ということです。