-   topic   - トピックス

[baserCMS].htaccessを編集してSSL通信を常態化(常時SSL)する

2014年11月13日 技術関係

少し前からSEO関連の話題として、SSL対応が効果的という話が出てくるようになりました。実際の効果がどれだけあるのかは分かりませんが、WEBサイトへの通信をセキュアにしておくというのは、サイトを訪問するユーザーにとっても望ましいことだと思います。

20141113_eye.jpg

そこで今回は、baserCMSを使ったSSL通信常態化し常時SSLで通信をおこなう方法について、ご紹介したいと思います。

環境
・baserCMS: 3.0.5.1
・SSL証明書: インストール済み
・その他: .htaccessを利用します(スマートURLが使える環境であること)

各種リソースの読込みを見直す

SSLでWEBサイトを表示させる場合、ブラウザのアドレスバーが緑色になると思いますが、緑の状態を保つには、そのページで読み込んで利用している画像、JS、CSSなどもSSL通信で取得しておく必要があります。もしも、ページ内部にSSL通信で取得していない項目があると、アドレスバーの緑色の部分に警告ができます(警告表示はブラウザによって異なります)。

外部サイトからファイルを読み込んでいる場合は、その外部サイトがSSL通信に対応していなければどうしようもありませんが、サイト内部のファイルを読み込む場合、せっかくならSSL通信を利用して読み込みたいものです。

内部ファイルについては、相対パスで画像等を読み込んでいるサイトが多いと思いますが、もしも「http://〜」から始まる絶対パスで読込を行っている場合、 「http://」の部分を「https://」とするか、相対パスで読み込むようにします(baserCMSの関数を使用している場合でも同様です)。

ちなみに、ソーシャル関係のボタンを使用している場合にも警告表示がされることがあります。 ボタン表示の為のJavaScriptの記述の中で、各種ソーシャルサービスと通信する部分が「http://」から始まるURLになっているような場合です。 各種ソーシャルサイトが自前で公開している、公式のソースコード以外を使っているような場合(jQueryのプラグイン等を使用している場合)で発生しやすいと思います。この場合は、公式のソースコードに差し替えるか、JavaScriptの記述を書き換える必要があります。

.htaccessの書き換え

次に「/app/webroot/.htaccess」を編集して、SSL通信を常態化させます。常態化させるために・・・

1.「http://」でアクセスがきたら「https://」に飛ばす。
2.HSTSに関する記述を行う。
3.wwwの有無を統一する(今回は「wwwなし」に統一)
4.baserCMSのスマートURLの記述に影響が出ないようにする。

という方向で実施しようと思います。なお「HSTS」は、ブラウザに対して「このサイトはSSLが使えるよ」と通知する仕組みですが、そのままでは初回アクセスがSSLでないという事と、少し前のブラウザなど「HSTS Preload」に未対応のものもあるようなので、通常の301リダイレクトも併用しています。結論的には以下のようになると思います(お使いの環境によって異なる部分は適時読み替えて下さい)。

Allow from all
Header set Strict-Transport-Security "max-age=315360000; includeSubDomains; preload"
RewriteEngine on
RewriteCond %{HTTP_HOST} ^hogehoge.jp$
RewriteCond %{HTTPS} off
RewriteRule ^(.*) https://hogehoge.jp/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^www.hogehoge.jp$
RewriteCond %{HTTPS} on
RewriteRule ^(.*) https://hogehoge.jp/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^www.hogehoge.jp$
RewriteCond %{HTTPS} off
RewriteRule ^(.*) https://hogehoge.jp/$1 [R=301,L]
RewriteBase /app/webroot
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

追記を行ったのは2行目と4〜12行目です。なお、2行目の記述がHSTSに関する記述になり、「HSTS Preload」に対応したものです(ちなみに「HSTS Preload」に対応したサイトは、そのドメインを対応サイト一覧に登録しておけば、対応ブラウザでアクセスがあった際、初めからHTTPS前提でアクセスしてくれるようになります→登録フォーム)。

追記:なお、HSTSプリロードの設定を行う場合で、SSL証明書がワイルドカードに対応していないような時は、そのドメイン全体がHSTS設定になりますので、ブラウザがSSLに対応していないサブドメインのページを拒否する事があります(SSL証明書を購入する際に「www」等を付けた形で取得していれば問題ないかも知れません)。

管理画面での設定おこなう

管理画面のサイト基本設定からWEBサイトのURLを登録しなおします。通常では「http://」から始めるURLが登録されていますが、これを「https://」から始まるアドレスに直します。このURLの設定を行わないと、アップローダープラグイン等でエラーが出ます。ここで登録されたURLを考慮した記述があるために、httpとhttpsが混在し、ブラウザ側が途中の処理をブロックしてしまうためです。

サイトにアクセスして確認する

ここまでの設定が終わったら、サイトにアクセスしてみて正常にSSL通信できるか試してみてください。WWW有無の統一も出来ているはずです。