さくら

[さくらのレンタルサーバー]SSL/TLSとwwwサブドメインのための.htaccess

さくらのレンタルサーバーでよくある.htaccessを実践する。独自ドメインが前提。

httpからhttpsにリダイレクト

#RewriteEngine on

#RewriteCond %{HTTPS} off
#RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URL} [R=301,L]

普通ならこのようにすればよいが、さくらのレンタルサーバーのSSL/TLSはリバースプロキシを利用している関係で、Apacheのmod_sslによるSSL/TLSを対象にしているRewriteCond %{HTTPS} offではうまくいかない。HTTPSアクセスの場合はどこかしらで環境変数HTTPS = onがセットされているのでこれを利用する。

RewriteEngine on

RewriteCond %{ENV:HTTPS} !on
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URL} [R=301,L]

または、HTTPSアクセスの場合のみ%{HTTP_X_SAKURA_FORWARDED_FOR}が出現するので、これを使っても良い(が、この方法ではヘッダにX-SAKURA-FORWARDED-FORが入っているHTTPリクエストを誤判定するので、HTTPS環境変数の方が無難)。

wwwサブドメイン

さくらのレンタルサーバーで独自ドメインを運用する場合、ドメイン名example.comに対してサブドメインwww.example.comでのアクセスを可能にするかどうかを選ぶことができる。www付きドメインでのアクセスを不可能にする設定にした場合、www付きドメインへのアクセスはさくらインターネットのエラー画面が表示されるようになる。そこで、www付きドメインでのアクセスを可能にした上で.htaccessでwwwなしのドメインへ転送したくなる。

RewriteEngine On

RewriteCond %{SERVER_NAME} !^example\.com [NC]
RewriteRule ^ http://example.com/%{REQUEST_URI} [R=301,L]

組み合わせ

この2つを組み合わせようとするとうまくいかない。www付きドメインへのアクセスであっても、HTTPSアクセスがリバースプロキシされる過程でHost HTTPヘッダがwwwなしのものになるため、Apacheに辿り着く時には情報が失われていて、環境変数などサーバーから観測できる範囲の情報ではどちらからのアクセスかは判別することができず、どうしようもない。

.htaccessの範囲ではないが、wwwなしのドメインを「www付与せず」の設定にした上でwww付きのドメインを追加で登録することで目的を達成することができるようである。(なお、今度はwww.www.example.comが問題になるが、これはもうどうしようもないので諦める)

その他

Apacheのバージョンは2.4系。2017年9月27日までは2.2系だった。

参考文献