XREAの標準ドメイン
XREAのサーバーをレンタルすると,標準ドメインとして [ユーザ名].[サーバ名].xrea.com(以下、標準ドメインと呼ぶ) が提供されるが,このドメインはSSLに対応していない.XREAではこのドメインの頭に https://[対応SSLサーバ名].xrea.com/(以下、SSLドメインと呼ぶ) をつけることでSSL化することができる.
問題点
通常であれば,.htaccessで
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://[SSLドメイン]/[標準ドメイン]/$1 [R=301,L]
とすればリダイレクトできるが,XREAではHTTPSでアクセスしていても_$SERVER["HTTPS"]
がNULLを返すため,リダイレクトがループしてしまう._$SERVER["HTTP_HOST"]
も「SSLドメイン」ではなく「標準ドメイン」を返すため区別できない.
解決法
事前に手動で「SSLドメイン」にアクセスし,以下のようなphpファイルを実行してリモートアドレスを取得する.
<?php
echo $_SERVER["REMOTE_ADDR"];
?>
XREAの共有SSLはプロキシサーバを経由することで実現しているらしく,「SSLドメイン」と「標準ドメイン」で違うアドレスが返ってくるので,.htaccessで
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^[SSLドメインのリモートアドレス]
RewriteRule ^(.*)$ https://[SSLドメイン]/[標準ドメイン]/$1 [R=301,L]
としておけば,HTTPアクセス時のみリダイレクトされる.
####- 注意 -
この設定によりphpMyAdminにアクセスできなくなるので,phpMyAdminを触りたいときは.htaccessをコメントアウトして無効化する必要がある.
おまけ
独自ドメインと標準ドメインを共存させてどちらも常時SSL化する
独自ドメインはあらかじめコンパネで無料SSLを有効化させておく.
以下のように.htaccessを設定する.
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^[SSLドメインのリモートアドレス]
RewriteRule ^(.*)$ https://[SSLドメイン]/[標準ドメイン]/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST"} !^[標準ドメイン]
RewriteRule ^(.*)$ https://[独自ドメイン]/$1 [R=301,L]
こうすることで,**http://[標準ドメイン]でアクセスした場合はhttps://[SSLドメイン]/[標準ドメイン]**が,**http://[独自ドメイン]でアクセスした場合はhttps://[独自ドメイン]**がリダイレクトされる.