coding tips

posted:2014.08.06

[.htaccess] 共有SSLによるhttps/httpアクセスの切り替え

レンタルサーバーで提供されている共有SSLを利用した場合のリダイレクト方法について紹介します。

共有SSLを利用する

サイトのコンテンツとしてお問い合わせフォームなど、個人情報を入力するような機能を実装する場合があります。 そのときの実装方法としては下記の2通りが考えられます。

  1. 画面のアクセスをSSL(https)を用いてアクセスするようにする
  2. レンタルサーバから提供されるフォーム(ssl対応)を利用する

今回は1の場合について考えます。

SSLに対応する場合、通常は独自でSSL証明書を取得する必要があります。 しかし、これには別途費用がかかります。

レンタルサーバーであれば共有SSLを無料で提供しているものがあります。 独自ドメインが使えないなどの制限がありますが、もっとも手軽にSSL対応する方法のひとつです。

http / httpsアクセスの切り替え

今回はエックスサーバー(X10)で「example.com(仮)」というドメインを使う場合を例に考えます。

エックスサーバーでは共有SSLをコントロールパネルから申し込むと、次のようなURLが与えられます。

https://example-com.ssl-xserver.jp/

これは「http://example.com/」でアクセスしていたpublic_html(Document Root)直下をみます。

つまり、問い合わせフォームなどSSL対応したいページは「https://example-com.ssl-xserver.jp/」でアクセスし、それ以外は独自ドメイン「http://example.com/」でアクセスします。

もしも、本来httpsで表示すべきコンテンツについてhttpアクセスがされた場合はリダイレクトし、その逆も対応する必要があります。

そこで、次のような.htaccessファイルをpublic_html(Document Root)直下に設置します。

RewriteEngine On
RewriteBase /

# 共有ssl対応URLへリダイレクト
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REQUEST_URI} /contact
RewriteRule contact/(.*)?$ https://example-com.ssl-xserver.jp/contact/$1 [L,R]

# ssl対応外URLへリダイレクト
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{REQUEST_URI} !contact/
RewriteCond %{REQUEST_URI} !common/
RewriteCond %{REQUEST_URI} !lib/
RewriteRule (.*)?$ http://example.com/$1 [L,R]

ここでは問い合わせフォーム(ディレクトリ:contact)についてSSLを用いるようにしています。

複数のURLにリダイレクトをかけたい場合はRewriteRuleの記述をその数だけ記述をすることになります。

加えて、SSL対応のページ(問い合わせフォーム)からCSSやJavaScript、画像などのファイルを当該ディレクトリ外から参照している場合はこれらもリダイレクトをかける必要があります。

上記の例ではcommon、libディレクトリに参照ファイル(CSS、JavaScript、画像 等)がある前提です。

動作確認環境