パーマリンクにカテゴリーを含めるか?含めないか?で悩み。
最初は無しで運営していたのですが、やっぱりカテゴリーの構造化をするためには含めておいたほうが良いかな。という考えに至り301リダイレクト処理した時の方法を残しておきます。
WordPressでは方法が2通り有り、プラグインか.htaccessで行う方法があります。
個人的には.htaccessの方がどういう処理を行っているのか仕組みを理解出来ますし、サーバーを今後移転しても.htaccessが対応しているサーバーならコピペで済む。
また極力プラグインを少なくして代用可能ならそちらで対応した方がWordPressの動作が軽くなるという考えから、今回は.htaccessの方法を取りました。
個別にリダイレクトをする方法だけ紹介すれば良いかな?と執筆当初は思ったのですが、よく使われるであろうリダイレクトの記述を探している人も居るかと思い併せて数点紹介しておきます。
設定を行う前に…。
あなたはリダイレクトの仕組みをよく理解していますでしょうか?
リダイレクトの使い所や、絶対にしてはいけないタブー行為など。
知らずにSEO評価を下げてしまう前に、一度は読んで欲しい基礎知識を別記事にまとめました。
.htaccessの編集を行う前に見ておくと、安心して以降のリダイレクト設定作業を行えると思いますので、一読しておくことをおすすめ致します。
301リダイレクトとは
301リダイレクトの記述方法を解説する前に簡単な301リダイレクトの解説をしておきます。
リダイレクトを解説する記事を見ると、大体301と302リダイレクトについて触れらている事が多いのですが、違いは以下の意味が含まれています。
恒久的なリダイレクト
このリダイレクトは将来変更することは絶対にないとサーバーに伝える方法。
SEO的には記事評価を全てリダイレクト先に譲渡して下さいと伝える方法。
検索エンジンからのアクセス流動や順位を引き継ぎたい場合には必ず301リダイレクトを使いましょう。
名前のTemporaryから分かる通り一時的なリダイレクト
もしかしたら将来は変更するかもしれない時に使用するリダイレクト。
SEO的にはリダイレクト先には評価を譲渡しない。キャッシュしない方法。
検索エンジンからのアクセスや評価は元記事に残ります。リダイレクト先が変更される可能性が将来的に残っているためオリジナルの方を重視します。
使い所は臨時的なメンテナンスページに飛ばしたり、同一コンテンツだけどアクセスした人を専用言語のページに飛ばす時やデバイス毎に振り分ける時などに使用します。
ex)"/"にアクセスした人
英語圏 /english.html
中国 /china.html
日本 /Japanese.html
タブレット /tablet.html
PC /pc.html
結局どっちを使ったほうが良いの?と悩むかもしれませんが、デバイス毎にページを振り分けない限りは301で良いでしょう。
今回私の場合はページのスラッグやパーマリンクを変更してしまい、以前のURLでは記事にアクセスできないため新しいURLに評価などを全て引き継いで欲しいということで301リダイレクトを使いました。
.htaccessはどこにある?
WordPressをインストールしたトップディレクトリに存在しています。
FTPツールなどでアクセスし、.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
記載されている内容は絶対に触らないで下さい。
上記の記述を簡単に説明すると存在するファイルやディレクトリは静的にそのまま表示する。存在しないURLにアクセスした場合にはアプリ(WordPress)で処理する。という記述です。
意味が分からず、適当に弄ってしまうとエラーを起こしサイトが白くなり見えなくなったりしますので注意して下さい。
不安な方は必ず作業をする前にバックアップを取っておきましょう。
記述場所はどこ?
WordPressを使用している場合は必ず# BEGIN WordPressの前に書いて下さい。
後ろに書くとエラーで正常に処理がされません。
# リダイレクト処理
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^old-page1.html$ new-page1.html [R=301,L]
RewriteRule ^old-page2.html$ new-page2.html [R=301,L]
RewriteRule ^old-page3.html$ new-page3.html [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
上記の記述例の様に、必ず# BEGIN WordPressの上に記載しましょう。
基本的な記述
基本は以下の記述になります。
# リダイレクト処理
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^old-page.html$ new-page.html [R=301,L]
</IfModule>
私の場合はパーマリンクに.htmlを付けていますので上記のようにしていますが、/で閉じている方は
RewriteRule ^old-page/$ new-page/ [R=301,L]
になります。もし/がない場合は
RewriteRule ^old-page$ new-page [R=301,L]
となります。
それでは一行ごと見ていきましょう。
#で始まる1行目
後に続く文字が全てコメントとして処理されます。
これは何の処理をしているのか?後で見直しても分かるようにメモを残しておきましょう。
2,5行目はサーバーでmod_rewriteの機能が有効であれば<IfModule>~</IfModule>の間に囲まれている記述の処理を実行して下さい。という宣言です。
WordPressが使えている時点でこの機能に対応していると思うので、そのままコピペして下さい。
3行目はリダイレクトの機能を有効にする宣言です。
4行目にリダイレクトの処理を記載します。
記述のスペース部分は半角の空白です。
[リダイレクト宣言] [転送元URL] [転送先URL] [301の宣言]
^は正規表現の「先頭一致」の意味でWordPressを設置したドメイン部分になります。正確には.htaccessが設置されている場所から見たURLです。
私のサイトであればhttps://php-labs.com/が^に置き換えられます。
$はこのURLの終わりを宣言しています。
つまり^old-page.html$はhttps://php-labs.com/old-page.htmlを指します。
ここには転送先のURLを記入するのですが、同ドメインであればドメイン部分を省略して構いません。もしドメインが変わるのであればhttps://から記入して下さい。
HTTPステータス301 Permanent Redirectで処理してくださいという宣言。
もしRや301を省略した場合は302リダイレクトされます。
LはLastの略称でこの行でLが現れるまでの処理が無事に実行されたら、この行での処理は終了。もし[L]以降になにかしら処理が書かれていたとしても、この行では処理は行わない。終わりという宣言です。
個別にリダイレクト
<IfModule mod_rewrite.c>
RewriteEngine On
# どちらも同じ301リダイレクト
# https:// 有り・無し
RewriteRule ^core-server-site-setting.html$ create-site/server/core-server-site-setting.html [R=301,L]
RewriteRule ^core-server-site-setting.html$ https://php-labs.com/create-site/server/core-server-site-setting.html [R=301,L]
# 複数紹介 記載例
RewriteRule ^install-wordpress-on-core-server.html$ create-site/server/install-wordpress-on-core-server.html [R=301,L]
RewriteRule ^web-install-wordpress.html$ wordpress/setting/web-install-wordpress.html [R=301,L]
RewriteRule ^google-search-console-settings.html$ create-site/seo/google-search-console-settings.html [R=301,L]
RewriteRule ^output-tag-from-functions-in-wp-head.html$ wordpress/customize/output-tag-from-functions-in-wp-head.html [R=301,L]
# もし302リダイレクトをしたい場合
# 全て同じ処理がされます
RewriteRule ^old-page.php$ new-page.php [R]
RewriteRule ^old-page.php$ new-page.php [R=302]
RewriteRule ^old-page.php$ https://www.new-domain.com/new-page.php
</IfModule>
実際に私のサイトでリダイレクトを行った際の記述を一部紹介。
パーマリンクにカテゴリー名を含めたいと考え、転送前はドメイン直下にスラッグが来てますが、転送先は全てカテゴリー名が含まれているのが分かると思います。
<IfModule>~</IfModule>の間には複数行リダイレクト処理を書けますので、個別に複数リダイレクトをしたい場合には改行しながら記載して下さい。
ディレクトリ単位で指定
<IfModule mod_rewrite.c>
RewriteEngine On
# 基本的な記述例
RewriteRule ^old-dir(.*)$ /new-dir$1 [R=301,L]
# カテゴリー名の変更例
RewriteRule ^create-site(.*)$ /site-affile$1 [R=301,L]
</IfModule>
WordPressでは記事のスラッグ(URL)が変わらずに、カテゴリーのスラッグを変更した時に使うと良いでしょう。
8行目のカテゴリー名変更例では以下の様な処理が行われます。
変更前https://exmple.com/create-site/seo/exmple.html
変更後https://exmple.com/site-affile/seo/exmple.html
カテゴリーのスラッグを「create-site」から「site-affile」に変えた例ですね。
ドメイン(サイト)ごとリダイレクト
<IfModule mod_rewrite.c>
RewriteEngine On
# ドメインを変更
RewriteRule ^(.*)$ https://new-site-domain.com/$1 [R=301,L]
</IfModule>
^(.*)$は改行以外の文字が0回以上続いた時TRUEを返します。
上記の記述は問答無用にアクセスしたら新しいURLに強制的に転送するという認識で問題ありません。
記事やカテゴリーなどのスラッグが全て同じでドメインだけ変わった場合には、個別に一個一個転送処理を書かず上記の一行を書くだけで全てのURLが新しいドメインに301リダイレクトされます。
www有り・無しに統一
<IfModule mod_rewrite.c>
RewriteEngine On
# www有りに統一
RewriteCond %{HTTP_HOST} ^your-domain\.com$
RewriteRule ^(.*)$ http://www.your-domain.com/$1 [R=301,L]
# www無しに統一
RewriteCond %{HTTP_HOST} ^www\.your-domain\.com$
RewriteRule ^(.*)$ http://your-domain.com/$1 [R=301,L]
# www有りに統一 汎用的な記述
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
wwwが無いURLにアクセスした場合に「https://www.~」にリダイレクトする方法です。
今後変更する可能性が少ないため永続的なリダイレクトの301を使います。
RewriteCondの後ろに書くドメイン部分は正規表現を使用するため「.」は「.」と記述しないとエラーになるので注意して下さい。
SSL(https://)にする方法
# SSL(https://)に転送
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.your-domain.com/$1 [R=301,L]
</IfModule>
今後もずっと常時SSLなため301リダイレクトを使用します。
しかし上記の方法でWordPressをhttpからhttpsに変更するよりも、あなたが契約しているサーバーに用意されている方法で変更したほうが良いでしょう。最適化されているでしょうし変更後のエラーも起こらないでしょうから。
上記の方法はhtmlサイトなどWordPress以外でSSLにしたい時に使うと良いでしょう。
リダイレクト処理が正常に行えているかの確認方法
リダイレクト設定を行った場合には必ず一度は設定が正常に行われているかの目視確認を行いましょう。
よくある間違いに301リダイレクトを設定したはずなのに302リダイレクトになっていた。リダイレクト先に正常に飛ばない。指定先が間違っていた。404エラーになる。など設定ミスがあります。
301リダイレクトの設定ミスがありスムーズにURL移行が行われなかった場合、インデックス減・アクセス減・収入源など良いことは一つもありませんので、別途専用で設定後の確認方法を書きましたので忘れないうちに一読して下さい。
いつまで301リダイレクトしておくべき?
301リダイレクトの記述方法が分かったけれど、それはいつまで残しておけばいいの?という疑問が浮かぶと思います。
数が少ないとそれほど気にはなりませんが、やはり.htaccessにずっと記述しておくとなると少なからず容量が増える。移行が正常に終えた場合はゴミに思えるかもしれません。
なにより永久に残しておくと考えた場合、負担に思えて何か嫌な気がしますよね。これに対してGoogleのジョンミューラー氏が以下の様な回答をしています。
Googleがサイト移転(301リダイレクト)を確認し、移転先を認識するのに約半年。場合によっては一年かかります。
無事Googleの認識が終了した後は301リダイレクトを削除しても構いません。
しかし他サイトから古いURLにリンクが貼られていた場合は、Googleが再度古いURLを表示する可能性があるため注意が必要です。
Googleのガイダンスに従えば、古いリンクも無駄にならず404エラーになる可能性を無くした方が良い。
私なら最低は1年残し、それ以降は出来る限りの間は取り除くことをしない。1年以降はあなたのサイト状況に合わせて対応して欲しい。
個人的にはブラウザのブックマーク機能を利用している人や、昨今のTwitterやSNSでの紹介・拡散されていた時などを踏まえ、限りなく残しておいた方が良いと思えますね。
他サイトに紹介をされているのであれば被リンクとしてカウントされてますし、何より404エラーで離脱する人を出来る限り取りこぼしたくないという思惑もあります。
それでも止む終えず削除したい人は、301リダイレクトを1年は必ず残しておく。という点だけは忘れずに覚えておきましょう。
更に詳しい情報を知りたい方は基礎知識をまとめたページをぜひ御覧ください。
忘れないためのメモを残そう
# 2019/07/07にリダイレクト処理
# 参考URL:https://php-labs.com/create-site/seo/301-redirect-of-htaccess-in-wordpress.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^old-page1.html$ new-page1.html [R=301,L]
RewriteRule ^old-page2.html$ new-page2.html [R=301,L]
RewriteRule ^old-page3.html$ new-page3.html [R=301,L]
</IfModule>
.htaccessには#から始まる行はコメントとみなされるという説明を行いました。これを利用して、いつリダイレクト設定を行ったのか必ずメモっておきましょう。
小さなことですが、これを残しておくことにより削除する時に迷うことなく削除する事が可能になります。
いつ、このリダイレクト書いたっけ?と悩まないために#のコメントを有効活用して下さい。
リダイレクトに関する記事一覧
これも一緒に読めばリダイレクトに関する内容はバッチリです!