XREAの常時SSL化について


当サイトはXREAに置かせていただいているのですが、広告が載るものの、無料コースでもSSLに対応できたり、 有料コースでもコスパ最高で、貧乏な私にはとてもありがたいレンタル屋さんです。

設定についても、昔のリムネットを思いだすくらい開放されて、自由度の高い設定を行うことができるが故、 高いスキルや知識が必要なほど、かなり難しいです。

で、初めてドメインを取得したこともあって、設定中のRewriteの見直しを行ったのですが、なかなか手強く、 丸1日格闘したのち勝利したので、その顛末を。

XREAのレンタルサーバは無料コースではディスクスペースの貸与があり、 広告が載りますがブログやメモなど幅広い用途に対応できます。

で、有料コースで申し込むと無料サブドメインをつけたり、ドメイン取得に申し込むことで追加したドメインをSSL化することもできますが、 下のようにhttpとhttpsの両方で開放されているため、これを全てhttpsに転送するようにします。

http://www.mydomain.com/
https://www.mydomain.com/

で、ApacheのRewriteを書くのですが、サイトを調べてみると多くのサイトで

RewriteEngine on
RewriteCond %{https} off
RewriteRule ^(.*)$ https:/%{REQUEST_URI} [R=301,L]

と紹介しているのですが、上の二つだけが対象なら十分ですが、実はこれでは不十分です。

というのも、無料コースで申し込むとディスクスペースとs**.xrea.comドメインが貸与されるのですが、 このドメインはSSLに対応することはできませんが、これをPROXYサーバに通してSSL化することが可能なため、 有料コースと同様に扱うことができます。

ここで厄介なのは、有料コースで貸与される仮想ドメイン公開用のディレクトリが、 無料コースで貸与されるディスクスペースの公開用ディレクトリ上に作成するため、 無料コースで付与されたURLから仮想ドメインのコンテンツにアクセスできることです。

つまり新しいドメイン(www.mydomain.com)にpage.htmlをサイトに置いた場合、

https://www.mydomain.com/page.html
http://www.mydomain.com/page.html
http://user.s**.xrea.com/www.mydomain.com/page.html
https://ss1.xrea.com/s**.xrea.com/www.mydomain.com/page.html

にアクセスすれば同じものが取得できるので、これらを1つのサイトにリダイレクトしないと意味がありません。 さらに、無料提供されているアクセス解析サービスはs**.xrea.comドメイン以外では閲覧できないため、 サービスを利用する場合は配慮する必要があります。

RewriteCond %{HTTP_HOST} !user\.s**\.xrea\.com
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(.*)$  https://%{HTTP_HOST}%{REQUEST_URI}  [R=301,L]

RewriteCond %{REMOTE_ADDR}  __REMOTE_ADDR-A__
RewriteCond %{REQUEST_URI}  ^/__SUB-DOMAIN-A__/  [NC]
RewriteRule ^(.*)$  https://$1  [R=301,L]

RewriteCond %{REMOTE_ADDR}  __REMOTE_ADDR-A__
RewriteCond %{REQUEST_URI}  ^/__SUB-DOMAIN-B__/  [NC]
RewriteRule ^(.*)$  https://$1  [R=301,L]

RewriteCond %{REMOTE_ADDR}  __REMOTE_ADDR-B__
RewriteCond %{HTTP_HOST}  user.s**.xrea.com
RewriteCond %{REQUEST_URI}  ^/__SUB-DOMAIN-A__/  [NC]
RewriteRule ^(.*)$  https://$1  [R=301,L]

RewriteCond %{REMOTE_ADDR}  __REMOTE_ADDR-B__
RewriteCond %{HTTP_HOST}  user.s**.xrea.com
RewriteCond %{REQUEST_URI}  ^/__SUB-DOMAIN-B__/  [NC]
RewriteRule ^(.*)$  https://$1  [R=301,L]

RewriteCond %{REMOTE_ADDR}  __REMOTE_ADDR-B__
RewriteCond %{HTTP_HOST}  user.s**.xrea.com
RewriteCond %{REQUEST_URI}  !^/__SUB-DOMAIN-B__/  [NC]
RewriteCond %{REQUEST_URI}  !^/__SUB-DOMAIN-A__/  [NC]
RewriteRule (.*) https://ss1.xrea.com/%{HTTP_HOST}/$1 [R=301,END]

もう少しスマートにできるが、とりあえず動いているのでこれでよし。

※正しく動いていないことがわかりましたので直しましたが、設定はセキュリティの都合上、公開できなくなりました。 上記設定では正しく機能しませんが上記設定がベースになっています。


<2019.04.14追記>

その後、動作確認をしたところ、やはり思うように動作していないことが分かったので、振り出しに戻りました。

まず、xrea のURLとドキュメントルート、アクセスするパスについてまとめると

(1)  無料スペース
            URL = user.s__.xrea.com
  DOCUMENT_ROOT = /public_html
           PATH = /

(2)  ※ここが難点
            URL = user.s__.xrea.com/sub_domain.xrea.com
  DOCUMENT_ROOT = /public_html
           PATH = /sub_domain.xrea.com

(3) 有料時のサブドメイン
            URL = sub_domain.xrea.com
  DOCUMENT_ROOT = /public_html/sub_domain.xrea.com
           PATH = /sub_domain.xrea.com

となり、 /public_html に書けば(1)(2)に /public_html/sub_domain.xrea.com に書けば(3) に対してディレクティブを与えることができるのですが、 (2)は2つのURLを持っているため、両方に対応するようなディレクティブを与える必要があります。

で、前述のサンプルをちょっと修正したものをいろいろなディレクトリに配置して無事対応できました。

Task Runner