Linux
mod_rewrite
CentOS
Apache

【mod_rewrite】「wwwあり」かつ「https」にリダイレクトさせる

やりたいこと

「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がない状態でアクセスされる。
  • [R=301,L]: 恒久的なリダイレクト(R=301)。処理はここで終わり(L)。

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 を記載しないと、そもそもリダイレクト処理が動かない。