mod_rewriteを使ってSSLオンオフを自動切換え

By | 2012/12/11

問合せコーナーの中はSSL有効で、他のコーナーはSSL無しで、というサイト作りが一般的だと思いますが、http と https で分けなければいけないため、ナビゲーションのリンクを絶対パスで書かなければならないというのが非常に不便です。

HTML上は普通に相対パスで記述しておき、SSLの必要なコーナーになったらhttpsへ、それ以外のコーナーになったらhttpへ自動的にページ遷移してくれるとメンテナンスが楽です。

以下のように.htaccessでRewiteしておけば、自動的に遷移してくれます。これなら、途中で別なコーナーもSSLにしたいと要望されてもリンク貼り直しも不要です。

HTTPS=on で/contact/~じゃないURLにアクセスがあったら、http://で始まるURLにリダイレクト。
逆に HTTPS=off で/contact/~というURLにアクセスがきたら、https://で始まるURLへリダイレクトさせます。

RewriteEngine On

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} (\.html)?$
RewriteCond %{REQUEST_URI} !(^/contact/)
RewriteRule ^.*$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} (\.html)?$
RewriteCond %{REQUEST_URI} (^/contact/)
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

もし、/order/もSSL対応させたければ (^/(contact|order)/) に変えればOK

わざわざ拡張子を.htmlに限定しているのは、自動切換え対象をhtmlだけに限定しておかなければ、html中で参照している/css/や/js/や/img/など、サイト全体で共通で使っているファイルまで勝手にSSL自動制御してしまうので、htmlはSSL有なのにcssはSSL無しなどと食い違ってしまうと、読み込みに失敗するからです。
?$ というのは、/で終わっている場合も想定しての指定です。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です