mod_rewriteで、強制的にHTTPからHTTPSにする方法

前回、mod_rewriteで、強制的にHTTPSからHTTPにする方法という記事を書きました。
その後、逆のことをする記事を書こうとしていたのですが、年度末の多忙に加え震災の影響もあり、なかなか時間を作れませんでした。

てなわけで、やっと書いていこうと思います。

今回の想定

今回は、SSL対応ページにて、何かの間違いなどでHTTPプロトコルで送信されると困る場合を想定しています。
例えば、個人情報が絡むお問い合せフォームや、ショッピングシステムの決済ページなどですね。

HTTPとHTTPSでドキュメントルート(公開ディレクトリ)が異なれば問題ないことなのですが、ドキュメントルートが同じ場合にはこういったことを想定しておいた方がいいでしょう。なにぶんhttpsをhttpにするだけで同じようにページが表示されてしまう訳ですから。

そういった時などに、何が何でもSSLプロトコルを通して送信してほしい場合に使うといいでしょう。

SSLでアクセスさせたい(HTTPはダメ!)

まずは完成型からです。全ての状況でふさわしいかはわかりませんが、私はこのように設定しました。

完成型

RewriteEngine on
RewriteCond %{HTTP_HOST} !^(local.example.jp)(:80)? [NC]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://www.example.jp%{REQUEST_URI} [R=301,L]

ステップごとに説明します。

mod_rewriteを有効に

いつもどうりのmod_rewriteを有効にするおまじないです。

RewriteEngine On

テスト環境では適用しない

私のローカルテスト環境ではlocal.example.jpのようなサブドメインでテストしているので、そこでもリダイレクトされると困ります。なのでテスト環境では適用しないようにしています。これは各人の環境にあわせて変更してください。

RewriteEngine On
RewriteCond %{HTTP_HOST} !^(local.example.jp)(:80)? [NC]

ファイルORディレクトリが存在するときのみ実行

ファイルやディレクトリが存在するときだけ、リライトを実行するようにします。
これをやらないと、存在しないURIにアクセスしても、リダイレクトされちゃいますので。

RewriteEngine on
RewriteCond %{HTTP_HOST} !^(local.example.jp)(:80)? [NC]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d

ポートが443では無い時のみ実行

今回はSSLでアクセスして欲しいのですから、ポート443、つまりSSLではない時のみ、リライトさせるようにします。
(前の記事もそうですけど、SSLがポート443ということを前提としていますが、違う場合は変えてください)

RewriteEngine on
RewriteCond %{HTTP_HOST} !^(local.example.jp)(:80)? [NC]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{SERVER_PORT} !^443$

リダイレクト

これまでの条件が適合する場合、SSLとしてリダイレクトさせます。
もちろん、恒久的なリダイレクトになりますので、301リダイレクトを指定してあげます。

これで完了です。

RewriteEngine on
RewriteCond %{HTTP_HOST} !^(local.example.jp)(:80)? [NC]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://www.example.jp%{REQUEST_URI} [R=301,L]

HTTPでアクセスしたい時と組み合わせる場合

例えば、通常コンテンツはHTTPでアクセスさせたいけれど、お問い合せフォームだけはHTTPSにしたい、というのが一般的によくある要望でしょう。

そんな時は、上位ディレクトリに、強制的にHTTPSからHTTPにする方法でご紹介した、HTTPでアクセスさせる用のmod_rewriteを.htaccessに記述します。

そして、お問い合せフォームが存在するディレクトリに、今回ご紹介したmod_rewriteを.htaccessに記述すればOK。お問い合せフォームのディレクトリ以下のみ、必ずHTTPSでアクセスできるようになります。

11/06/22補足
.htaccessに

SSLRequireSSL

とすることで、HTTPの場合に403を返すようにもできるそうな。

httpd.confに書く場合は以下のような感じ(/path/to/dirは変えてくださいね)。

<Directory /path/to/dir>
SSLRequireSSL
</Directory>

HTTPへ転送はできないけれど、SSLをマストにするだけなら楽ちんでいいかもです。

コメント

タイトルとURLをコピーしました