hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

.htaccessでHTTPアクセスをSSLでリダイレクト(逆もアリ)

.htaccessを使って、HTTPでアクセスされたページをSSLでリダイレクトする方法と、SSLでアクセスされたページをHTTPでリダイレクトする方法です。

今回は、以下の2パターンで試してみました。

環境変数HTTPS」を使用する場合

メイビンラボさんのページを参考にさせてもらいました。
一番簡単で分かりやすい方法はコレだと思います。
「RewriteCond」で環境変数HTTPS」の値を判定します。

  • HTTPS」がoffの場合 → HTTPでのアクセスなのでSSL(HTTPS)でリダイレクト
  • HTTPS」がonの場合 → SSL(HTTPS)でのアクセスなのでHTTPでリダイレクト

.htaccessを全てのディレクトリに置くのは管理が煩雑になってよろしく無いので、DocumentRoot直下にHTTPページ用.htaccessを配置してSSLを使いたいページ(ディレクトリ)にだけSSLページ用.htaccessを配置するとか、.htaccessは一つでRewriteCondでディレクトリを指定するとかが良い方法だと思います。

SSLページ用.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
HTTPページ用.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTPS} on
    RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
(補足) RewriteRuleの[R,L]の意味

RewriteRuleの一番後ろに書かれている[R,L]の意味は、

[L]は、定義の最終行(Last)を意味します。この行以降のRewriteRuleは無視されます。一番最後の行に書きます。
[L]を書かなくても動作します。
[R]は、リダイレクトを行います。

http://memorva.jp/memo/linux/mod_rewrite.php

になります。

環境変数「SERVER_PORT」を使用する場合

環境変数HTTPS」を使用する場合と、ほぼ同じようなやり方です。
「RewriteCond」で判定する環境変数が「SERVER_PORT」に変わっているだけです。

「RewriteCond」で環境変数「SERVER_PORT」の値を判定方法は、

  • 80の場合 → HTTPでのアクセスなのでHTTPSでリダイレクト
  • 443の場合 → HTTPSでのアクセスなのでHTTPでリダイレクト

※HTTP/SSLのポート番号について、ここではデフォルトのポート番号を使用していますが、サーバーによっては異なる場合があるので、確認が必要です。

SSLページ用.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
HTTPページ用.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{SERVER_PORT} 443
    RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
「SERVER_PORT」を使用するメリット

SSLアクセラレータ等を使用している場合、SSLアクセラレータ⇔Apache間の通信がHTTPになるため、環境変数HTTPS」は常に「off」となってしまい、.htaccessでのリダイレクトが出来なくなります。
SSLアクセラレータ等の設定によっては、SSLアクセラレータ⇔Apache間の通信がHTTPのままでも、接続するポート番号だけを変えられることがあります。
その場合、「SERVER_PORT」を使用することで、HTTP/SSLの振り分けリダイレクトを行うことが出来ます。
SSLアクセラレータ側でポート番号等を変えられない場合は、.htaccessでは対処出来ないので、他の解決方法を考える必要があります。

今回参考にしたページ

.htaccessだけでSSL対応するには - メイビンラボ
http://www.meibinlab.jp/nishijima/archives/54

mod_rewriteのインストール・設定 - RewriteRuleのサンプル - MEMORVA
http://memorva.jp/memo/linux/mod_rewrite.php

mod_rewrite の R フラグと L フラグについてメモ(R を省略できる場合)- 刺身☆ブーメランのはてなダイアリー
http://d.hatena.ne.jp/a666666/20090409/1239270356

Apacheサーバー構築法 第5回 設定を上書きする「.htaccess」- ITPro
http://itpro.nikkeibp.co.jp/article/COLUMN/20080512/301299/