WHAT'S NEW?
Loading...

mod_rewriteでディレクトリ別にSSLのON/OFFを切り替える

以下の様なディレクトリがあったとする。

A. htdocs/sslon/
B. htdocs/ssloff/

Aのディレクトリ内は必ずhttp://から始まるURLに、
Bのディレクトリ内は必ずhttps://から始まるURLにしてみるテスト。
  1. htdocsに.htaccessを作成
  2. SSLを有効にするために以下を記述
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/sslon/.*$
RewriteRule /.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
これで、/sslon内のコンテンツは必ずsslが有効になり、https://になる。

簡単に説明すると、
まず1行目でRewriteを有効にするため、RewriteEngineに対して引数にOnを与える。
RewriteEngine On
これでmod_rewriteの機能を使えるようになる。



次に、「どういうときにどうするか」、の、「どういうときに」という条件を設定する。
ちなみにこの条件と言うのは「コンディション」と呼び、実際の書式はRewriteCondになる。
「SSLじゃなかったらSSLにしたい」わけなので、まずはHTTPSになっているのかなってないのかを条件に加える。
RewriteCond %{HTTPS} off
これで、SSL(HTTPS)が無効になっている状態だったら、と言う条件になる。
SSLであるかどうかをポート番号で調べる方法もある。
%{SERVER_PORT} !^443$
だ。しかし、SSL=443というのはデフォルト設定であるわけで、変更可能な番号でもある。したがって、%{HTTPS} offと指定しておいた方が良いと思わないか?
RewriteCondは続けて別の行にも複数記述でき、全部の条件が一致した場合、という指定が出来るので、続けて別の条件をつける。
というわけで、次に指定する条件は、正規表現でディレクトリを指定する。
なにがどういうときか、の「なにが」は、この場合リクエストURIを使う。
リクエストURIというのは、たとえばURLがhttp://example.com/hoge/fuga/の場合、/hoge/fuga/の部分になる。
このリクエストURIに特定の文字が含まれていたら、という条件にしてみた。
RewriteCond %{REQUEST_URI} ^/sslon/.*$
これはリクエストURIの先頭が必ず/sslonで始まり、その後に何かあったり無かったりした場合、と言う事になり、結果的に「/sslonディレクトリ内」ということになる。

基本的には上記2つの条件でOKで、あとは「どういうときにどうするか」の「どうするか」を指定する。
指定するためにはルールという形で指定し、実際にはRewiteRuleという書式に指定することになる。

上記条件がそろった場合、「これ」を「こう」するという指定になる。
RewriteRule /.*$  https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
まず、RewriteRuleには二つの引数を指定し、最初が「これ」で次が「こう」になる。
上記の場合、
「/.*$」を「 https://%{HTTP_HOST}%{REQUEST_URI} [R,L]」に変更する
という意味になる。
キモとなるのは、プロトコル部分のhttpsだ。これを指定したいがために、そのほかの部分をApache内部の変数にしている。
ようするに「プロトコルだけ変えたかったけどURL形式で指定しないといけない」というわけ。

で、上記.htaccessで、httpじゃなかったらhttpsにするのは出来たが、一度httpsになってしまうと、トップページへ戻ったときなんかにもずっとhttpsになってしまう。

というわけで、httpだったらhttpsにするという条件の逆を追記してみた。
最終的に完成した.htaccessは以下になる。
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !(^/sslon/.*$)
RewriteRule /.*$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/sslon/.*$
RewriteRule /.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
httpsからhttpにリダイレクトする際、「ssloffだったら」という条件で作ってしまうと、httpだけのページが増えたときに、都度.htaccessにディレクトリを指定しなくてはいけなくなってしまうので、単純に「sslonじゃなかったら」という条件にしてある。

これなら、sslonじゃないディレクトリはすべからくhttpとなり、SSLが無効になってくれる。
参考にされたし。