WordPressの常時SSL化では、.htaccessの順序に注意!

今や常識ともいえる「ウェブサイトの常時SSL化」ですが、先日、既存のWordPressを常時SSL化する際にハマってしまいました。

下層ページがhttpsにリダイレクトされない!

既存のWordPressサイトを常時SSL化する際、私は下記のような手順で行っています。
SSL化プラグインを使うとプラグインが外せなくなるのと、WordPress以外に対して常時SSL化ができないので、多少面倒でも下記のようにしています。

  1. サーバーでSSLを有効にする
  2. Search Replace DB で、WordPress内の文字列を http → https に置換

    SearchRegexプラグインを使う記事を多く見かけますが、このプラグインではカスタムフィールド内の文字が置換されなかったりすることがあるのでお勧めしません。
  3. .htaccess に、httpでのアクセスをhttpsにリダイレクトする設定を追記する

今回のサイトはWordPressがサブディレクトリにインストールされているので、すでにルートディレクトリに .htaccess が存在していました。
そこで私は、リダイレクトの記述を下記のように追記しました。

# 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

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

ところがこの書き方では、トップページ以外に http でアクセスすると、https にリダイレクトしてくれません。
(正確には、トップページでも index.php をつけるとリダイレクトしません)

これはなぜかというと、ドメインのみでアクセスした場合以外は、WordPressのリダイレクトルール(# BEGIN WordPress# END WordPress)が適用されて、[L] フラグで .htaccess の実行が終了してしまうからです。 

リダイレクトルールは書く順序に注意!

正しくはこのように、httpsへのリダイレクトルールを、WordPressのリダイレクトルールの前に書きます

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

# 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 へのリダイレクトルールが適用されて .htaccess の実行が終了しますが、http以降のURLは変更されていないのでリダイレクト後に再度同じディレクトリにアクセスされます。
すると今度は httpsでアクセスされているので https へのリダイレクトルールは適用されず、WordPressのリダイレクトルールが適用されます。

常時SSL化の際の .htaccess の書き方は多くのブログ記事で見かけるのですが、リダイレクトルールを書く位置についてきちんと説明した記事はほとんど見かけませんでした。

いつもやっていることだからと適当に作業してしまうと、こういった間違いに気づかずにハマってしまいますね。
今後は気を付けたいと思います。

コメントを残す