WordPressのURLを.htaccessでリダイレクトするぞ、と思って書いてみたら全くリダイレクトされずに小一時間悩んだのでメモとして残しておきます。
WordPressの記事URLをリダイレクトしようと思ったわけ
WordPressで投稿や個別記事を作成するとスラッグが付きます。このスラッグがWordpressの投稿や個別記事にアクセスするURLになります。
スラッグは設定によりますが、自分の場合はタイトルがスラッグになるように設定してあります。
WordPressがルールに則ってつけたスラッグを後から自分で変更した場合、Wordpress内部で勝手にリダイレクトされるようですが、自分で変更した後に再度変更するともうリダイレクトされません。
そんなときは301リダイレクトのお世話になるわけです。
今回リダイレクトしようと思った理由は、URLを自分で再度変更したからです。
WordPressが.htaccessに勝手に書き込む何か
301リダイレクトの書式そのものはググれば簡単に出てきます。
こんな感じです。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^hoge/?$ /hogehoge/ [R=301,L]
RewriteRule ^hoge-hoge/?$ /hoge-hoge-hoge/ [R=301,L]
</IfModule>
しかし、Wordpressに対して301リダイレクトの記述を追加して、それを行う時に注意すべき点がいくつかあります。
まず、Wordpressが勝手に.htacessに何か書き込んでいます。
それは次のような記述です。
# 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
自前のリダイレクトを記述するのは、この中でもないし、この後でもありません。
WordPressが追加した記述よりも手前に、リダイレクトの記述を追加しなければなりません。
そうすると期待通りに動きます。
ちなみに”/?$”は『最後にスラッシュがあっても無くてもよい』という意味の正規表現です。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^hoge/?$ /hogehoge/ [R=301,L]
RewriteRule ^hoge-hoge/?$ /hoge-hoge-hoge/ [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
まとめ
.htaccessを直接いじる機会というのもあまりないので、たまにいじると昔ハマって調べたこともすっかり抜け落ちていて、また同じことを繰り返してしまいます。それがいい加減イヤになったのでこの記事を書きました。
URLの変更やサーバーの引っ越しなどで301リダイレクトをする機会は多いと思いますが、プラグインに頼らずに自前で.htaccessに書き込む場合は今回の記事の内容は覚えておいた方が良いです。