#やりたいこと
「wwwあり」かつ「https」にリダイレクトさせる
■使用するドメイン(※存在しないものです。)
takahashi.local
■想定されるアクセスパターン
①http://takahashi.local にアクセス ⇨ https://www.takahashi.local へリダイレクト
②http://www.takahashi.local にアクセス ⇨ https://www.takahashi.local へリダイレクト
③https://takahashi.local にアクセス ⇨ https://www.takahashi.local へリダイレクト
#構成
- LBはなし(サーバーに直接アクセスが来る)
- SSL証明書はサーバー上に設定済み
- CentOS7
- Apache2.4
- mod_rewrite
- Vhostsの設定ファイル(/etc/httpd/conf./配下)で設定を記述する
#実際に行った設定
# cat /etc/httpd/conf.d/rewrite.conf
<VirtualHost *:80>
DocumentRoot "/var/www/html"
ServerName www.takahashi.local
ServerAlias takahashi.local
RewriteEngine On
RewriteRule ^(.*)?$ https://www.takahashi.local$1 [R=301,L]
</VirtualHost>
<VirtualHost *:443>
DocumentRoot "/var/www/html"
ServerName www.takahashi.local
ServerAlias takahashi.local
SSLEngine on
SSLCertificateKeyFile /etc/httpd/ssl/key/www.takahashi.local.key
SSLCertificateFile /etc/httpd/ssl/certs/www.takahashi.local
SSLCertificateChainFile /etc/httpd/ssl/certs/www.takahashi.local-chain.crt
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)?$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</VirtualHost>
#解説
- ServerAlias: takahashi.localにアクセスが来ても、「ServerName www.takahashi.local」 が処理するようにする。
- RewriteCond %{HTTPS} on: httpsでアクセスされる。
- RewriteCond %{HTTP_HOST} !^www.: ホスト部の先頭にwwwがない状態でアクセスされる。
###80番ポートでアクセスが来た際のリダイレクト設定
80番ポート(http)でアクセスが来たら、有無を言わさず「https://www.takahashi.local」 へリダイレクトさせれば良いので、下記のようにRewritecondは書かなくてOKです。
<VirtualHost *:80>
DocumentRoot "/var/www/html"
ServerName www.takahashi.local
ServerAlias takahashi.local
RewriteEngine On
RewriteRule ^(.*)?$ https://www.takahashi.local$1 [R=301,L]
</VirtualHost>
###443番ポートでアクセスが来た際のリダイレクト設定
ただし、443番ポート(https)でアクセスが来た時のリダイレクトされるパターンは、「wwwなし」かつ「https」なのでその条件式をRewritecondに書いてあげないといけません。
<VirtualHost *:443>
DocumentRoot "/var/www/html"
ServerName www.takahashi.local
ServerAlias takahashi.local
SSLEngine on
SSLCertificateKeyFile /etc/httpd/ssl/key/www.takahashi.local.key
SSLCertificateFile /etc/httpd/ssl/certs/www.takahashi.local
SSLCertificateChainFile /etc/httpd/ssl/certs/www.takahashi.local-chain.crt
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)?$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</VirtualHost>
#つまづきポイント
- Vhostsの設定ファイルにSSLの設定(SSLEngine等)を記載する場合、デフォルトのssl.conf内の証明書ファイルパスをコメントアウトするとApacheが起動しなくなる。
- Listen443の記載するファイルは1つのみ。複数の設定ファイルで記載すると競合してApacheが起動しません。
- RewriteEngine On を記載しないと、そもそもリダイレクト処理が動かない。