.htaccessのみでSSL対応

特定ページのみをSSL対応にする場合
本来であればリンクを細かく調整すべきなんだろうけど
そうも言っていられない状況もある。

そこで.htaccessのmod_rewriteだけでできないのかな?と探してみたところ、
幾つか発見したのでメモ。

まずはSSLにしたいページのディレクトリに.htaccess作成
以下の例の場合、contact.php、contact_2.php、、contact_3.phpだけをSSL対象にできる。

RewriteEngine on

RewriteCond %{REQUEST_URI} .*/contact.php$ [OR]
RewriteCond %{REQUEST_URI} .*/contact_2.php$ [OR]
RewriteCond %{REQUEST_URI} .*/contact_3.php$
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

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

http://xxx.com/xxx/contact.phpでアクセスすると自動的に
httpsにリダイレクトされるんで、リンクのURLの修正などは不要になる。

ただこれだけだと、SSLページ内からリンクを踏まれて相対URLによって
本来、非SSLの別ページに飛んだ際に、httpsのまま飛んでしまうので、
ルートディレクトリに.htacessを作成して、これを防ぐための設定を追加。

RewriteEngine on
RewriteCond %{SERVER_PORT} ^443$
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

これによって、SSLにしておきたいページ以外へhttpsでアクセスした場合に強制的にhttpにリダイレクトさせる事が可能になる。

で、さらにもう一つ設定が必要で、これらの調整で設定されたSSLページを開いてみると
画像ファイルなどがうまく表示されなくなったりする場合がある。
一般的に画像は/imageなどに格納する場合が多いので
画像アクセスの際にどうやらルーディレクトリに配置した.htaccessによって、httpsがhttpに書き換えられてしまうらしい。
そこで、画像が保存されているディレクトリにも.htaccessを作成

RewriteEngine off

画像ファイルへのアクセス時はmod_rewriteを無効にしてやる。
これでhttpsでアクセスされた場合はSSLで画像にアクセスされるし、
httpでアクセしさせた場合は通常アクセスで画像が取得される。

その他、jsファイルやcssファイルなどのディレクトリにも
mod_rewite無効化の設定が必要になるかな。

いじょ。
なんだかんだで.htaccessを配置しまくんなちゃいけないけど、
リンクのURLを全て修正するのと、どっちが楽かで、状況に応じて判断すべきかな。

Comments are closed.