WordPressなサイトでhttpなアクセスをhttpsにリダイレクトさせる方法


Googleさんが「HTTPSページが優先的にインデックスに登録されるようになります」というアナウンスを出してから、SEOに影響するのではないかとサーバー証明書の導入を進めるページが増えてきていると思います。まぁ、このアナウンスはよく読めば判るのですが、SEOに影響するとは一言も書かれていないんですけどね。デマがデマを呼び、いつの間にかSEOにSSL化は必須みたいな話になっているところが笑えるところではあります。

さて本題ですが、従来https非対応で構築したWordPressなサイトにサーバー証明書を導入しhttps対応にしたときに、httpでアクセスしてきたモノを強制的にhttpsにリダイレクトさせるにはどうしたら良いかという情報を多々収集してきました。その結果、多くの情報が.htaccessに以下の内容を書き込めば良いという話になっています。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

ところが、コレはWordPress自身が.htaccessに書き込む以下の内容とぶつかってしまい、トップページでしか機能しません。また、先の記述と順番を入れ替えるとWordPress自身の挙動がおかしくなります。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

具体的には、後者の記述の後に前者の記述を行うと、トップページ以外にhttpで直接アクセスするとhttpsへのリダイレクトが機能せず、そのままhttpでのアクセスになってしまうという現象になります。後者の記述より前に前者の記述を持ってくると、トップページ以外にhttpでアクセスすると404 Not Foundになってしまいます。さて、困りました。

もう少し調べると、いわゆるモダンブラウザ(今現在使われているブラウザ)ではHSTS(HTTP Strict Transport Security)に対応しており、以下の記述を.htaccessに行えば次回以降は強制的にhttps接続にすることができると言うことが判りました。

Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

残念ながら初回はhttpで接続されてしまうものの、次回以降はhttpsで接続されるようになります。コレで先に挙げた問題は解決しました。ちなみに「HSTS Preload Submission」というサイトがあり、ここにHSTSの設定をしたドメインを登録すると、多くのブラウザが事前にここの情報を参照してくれて、最初からhttpsで接続してくれるようになるそうです。登録には数週間かかるようですが、是非とも登録しておくと良いでしょう。

あと、サブドメイン(www.example.jp以外にshop.example.jpというサイトを持っているとか)にもHSTSの設定は影響してしまいますので、サブドメインも含めてサーバー証明書を導入しSSL化しておく必要があります。これは注意点として覚えておいてください。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です