エックスサーバー(Xserver)でhttpやwwwから始まるアクセスを301リダイレクト
mixhost から Xserver へレンタルサーバを移行して 1 か月ほど。
初期設定では以下のアクセスが制御されずに、そのままサイトが閲覧できてしまいます。
・www ありのドメイン指定
・http プロトコルによるアクセス
例えば、以下のようなリクエストですね。
https://www.example.org
https://www.example.org/hoge
http://example.org
http://example.org/hoge
一般的なリダイレクト設定は他のサイトでも紹介されていますが、細かいところに手が届いていないものが多く、結果的に自分で設定してみました。
今回は .htaccess によるリダイレクトの記述を紹介します。
wwwありのURLをwwwなしにリダイレクト
こちらの設定は「%{HTTP_HOST}」の内容が www から始まっているかを確認すること。
http や https のプロトコルは気にしません。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ https://example.org%{REQUEST_URI} [R=301,L]
</IfModule>httpのプロトコル要求をhttpsにリダイレクト
昨今では http はセキュリティ的にタブーということで推奨されていないので、自分では意図していなくても、そのまま http でサイトが閲覧できてしまうのは恥ずかしいですよね。
リダイレクト先の URL のドメインは「%{HTTP_HOST}」で置き換えれなくもないですが、次に紹介する条件指定の際など汎用的に使えなくなるのでベタに「example.org」とします。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-SSL} !on
RewriteCond %{HTTP_HOST} ^example\.org(.*)$
RewriteRule ^(.*)$ https://example.org%{REQUEST_URI} [R=301,L]
</IfModule>2つの条件を同時に設定
2 つの制御を 1 つの .htaccess にまとめます。
ここで注意したいのが、www 判定と http 判定を単純に [OR] でつなぐと、https://www.example.org(すでに https だが www あり)が漏れてしまう点です。
%{HTTPS} off の条件が www 側にも AND で効いてしまい、「https かつ www」のケースが素通りするためです。
そこで、www を外すルールと http を https にするルールを、2 つの RewriteRule に分けて書きます。
<IfModule mod_rewrite.c>
RewriteEngine On
# ① www あり → www なし(プロトコルは問わない)
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://example.org%{REQUEST_URI} [R=301,L]
# ② http → https
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-SSL} !on
RewriteRule ^(.*)$ https://example.org%{REQUEST_URI} [R=301,L]
</IfModule>
これで、冒頭の 4 パターン(http / https × www あり / なし)を、すべて https://example.org の正規 URL にそろえられます。
