A. htdocs/sslon/
B. htdocs/ssloff/
Aのディレクトリ内は必ずhttp://から始まるURLに、
Bのディレクトリ内は必ずhttps://から始まるURLにしてみるテスト。
- htdocsに.htaccessを作成
- SSLを有効にするために以下を記述
- RewriteEngine On
- RewriteCond %{HTTPS} off
- RewriteCond %{REQUEST_URI} ^/sslon/.*$
- RewriteRule /.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
簡単に説明すると、
まず1行目でRewriteを有効にするため、RewriteEngineに対して引数にOnを与える。
- RewriteEngine On
次に、「どういうときにどうするか」、の、「どういうときに」という条件を設定する。
ちなみにこの条件と言うのは「コンディション」と呼び、実際の書式はRewriteCondになる。
「SSLじゃなかったらSSLにしたい」わけなので、まずはHTTPSになっているのかなってないのかを条件に加える。
- RewriteCond %{HTTPS} off
SSLであるかどうかをポート番号で調べる方法もある。RewriteCondは続けて別の行にも複数記述でき、全部の条件が一致した場合、という指定が出来るので、続けて別の条件をつける。
%{SERVER_PORT} !^443$
だ。しかし、SSL=443というのはデフォルト設定であるわけで、変更可能な番号でもある。したがって、%{HTTPS} offと指定しておいた方が良いと思わないか?
というわけで、次に指定する条件は、正規表現でディレクトリを指定する。
なにがどういうときか、の「なにが」は、この場合リクエストURIを使う。
リクエストURIというのは、たとえばURLがhttp://example.com/hoge/fuga/の場合、/hoge/fuga/の部分になる。
このリクエストURIに特定の文字が含まれていたら、という条件にしてみた。
- RewriteCond %{REQUEST_URI} ^/sslon/.*$
基本的には上記2つの条件でOKで、あとは「どういうときにどうするか」の「どうするか」を指定する。
指定するためにはルールという形で指定し、実際にはRewiteRuleという書式に指定することになる。
上記条件がそろった場合、「これ」を「こう」するという指定になる。
- RewriteRule /.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
上記の場合、
「/.*$」を「 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]
これなら、sslonじゃないディレクトリはすべからくhttpとなり、SSLが無効になってくれる。
参考にされたし。
facebook
twitter
google+
fb share