apacheで常時SSL化して、URL正規化するには

前書き

今回、Apacheの設定を変更するが、.htaccessは使わず、confファイルを変更する。 .htaccessは管理者以外も変更できてしまうので、基本的には非推奨。 confファイルも、なるべくhttpd.confの直接書き込まないようにする。

URL正規化

各バーチャルホスト設定の中に下記を追加する。

wwwなしからありにリダイレクトする場合

  ServerAlias www.example.testtotest.com
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^example.com
  RewriteRule ^(.*)$ http://www.example.com [R=301,L]

wwwありからなしにリダイレクトする場合

  ServerAlias www.example.testtotest.com
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www.example.com
  RewriteRule ^(.*)$ http://example.com [R=301,L]

筆者は443のバーチャルホスト設定では、RewriteRuleをhttpsで記述したが、httpのままで問題ない模様。

常時SSL化

80のバーチャルホスト内に以下を追加する。

  RewriteEngine on
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=308,L]

常時SSL化とURL正規化を両方行う。

今回、以下の4つのURLを、https://www.example.comにリダイレクトする想定で行う。

  • https://www.example.com
  • https://example.com
  • http://www.example.com
  • http://example.com

そうすると、以下のようなバーチャルホスト設定になる。

<VirtualHost *:80>
  ServerName example.com
  ServerAlias www.example.com
  RewriteEngine on
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=308,L]
  ~~~~~~~~~~~~~~~~
  #以下略
</VirtualHost>

<VirtualHost _default_:443>
  ServerName example.com
  ServerAlias www.example.com

  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^example.com
  RewriteRule ^(.*)$ https://www.example.com [R=308,L]
  ~~~~~~~~~~~~~~~~
  #以下略
</VirtualHost>