WordPressで301リダイレクト|記事の移行は転送が先

受託の仕事で、WordPressの記事をまとめて新しいURLへ移す作業をやりました。古いURLの記事は非公開にして、301リダイレクトで新しい記事へ飛ばす。言葉にすると1行です。けど実際は、順番を1つ間違えただけで、古いURLが全部トップページへ飛ばされるところでした。

先に結論です。WordPressで記事を移す時は、①新しいURLへの301リダイレクトを先に全部登録して、②転送が効いとるのを確かめてから、③元の記事を非公開にします。逆の順にすると、元記事が消えた瞬間に「存在しないページ」になって、サイトの設定しだいではトップページへ飛ばされます。

記事をまとめて新しいURLへ|作業は2段階

依頼の中身は、今ある記事を、新しいURLの記事として作り直すこと。作業は2段階に分かれてました。

  • 1段階目:記事を新しいURLに複製して、古い記事に「正規版はこっち」という印(canonical)を付ける
  • 2段階目:古い記事を非公開にして、301リダイレクトで新しい記事へ飛ばす

いきなり2段階目をやらんかったのは、Googleが新しい記事を正規版として認めてくれるかを先に見たかったからです。canonicalは命令やなく「強いシグナル」扱いで、Googleが別のURLを選ぶこともあります。

Search ConsoleのURL検査で見たら、canonicalを入れて1週間足らずで「Googleが選択した正規URL」が新しい記事に変わってました。ただし確かめたのは2本だけ。全部を見たわけやありません。それでも「効いとる」と言える材料が揃ったので、2段階目に進みました。

転送を入れる前に、サイトの「今の転送」を調べた

いちばん効いたのは、ここでした。試しに存在しないURLを開いたら、404にならずにトップページへ飛んだんです。

誰が飛ばしとるのか。転送の返事(レスポンスヘッダ)を見たら「X-Redirect-By: Rank Math」と書いてありました。SEOプラグインのRank Mathに、「ページが見つからん時はトップへ転送する」設定(フォールバック動作)が入っとったわけです。

これはこのサイトの設定の話です。自分のサイトでも、存在しないURLを1回開いてみてください。ちゃんと404のページが出るなら、この先に書くトップページへ飛ぶ怖さはありません。トップへ飛ぶなら、同じ注意が要ります。

ついでに分かったことが2つ。

  • Rank Mathの転送機能で、すでにいくつも転送が動いとった
  • 転送用のプラグイン「Redirection」も入っとったけど、停止中やった

なので今回の転送は、全部Rank Mathに入れました。.htaccessやRedirectionは使ってません。転送の置き場所が2つになると、あとで「どっちが効いとるんや」が追えんくなるからです。

数が多い時の注意も1つ。Rank Mathで転送をCSVからまとめて取り込む機能は、有料版(PRO)だけです。数が多い時は、有料版のCSV取り込みか、プログラムでの一括登録になります。今回はプログラムから入れました。

順番は「転送が先、非公開が後」

非公開が先はバツ、転送が先はマルの301リダイレクト手順3段階比較図
404をトップへ飛ばす設定のサイトでは、非公開を先にすると古いURLがトップへ飛ぶ

フォールバックの存在を知ったあとやと、順番の怖さがよう分かります。

先に元記事を非公開にすると、その瞬間に古いURLは「存在しないページ」になります。このサイトでは、それがトップページへの転送に化ける。途中で作業が止まったら、非公開にした分の古いURLが全部トップへ飛ぶ状態で放置されます。読んどる人からは、サイトが壊れたように見えます。

Googleも、たくさんの古いURLを関係の薄い1ページ(トップページなど)へ転送するのは避けるよう書いてます。ソフト404(中身の無いページ)とみなされる場合がある、とのことです。

逆に転送を先に入れておけば、途中で止まっても困りません。転送が効けば新しい記事へ届くし、効かんでも元記事はまだ公開中なので普通に読めます。どっちに転んでも壊れて見えん。この順番に決めた理由はそこです。

もう1つ決めたのが、元記事は削除せず「下書き」に戻すこと。ゴミ箱にも入れません。何かあった時に、公開状態へ戻すだけで元どおりにできるからです。

自分のブログで1本だけ移すなら、今回の流れを縮めてこうなります(Rank Mathを使っとる場合)。

  1. Rank Mathの「Redirections(リダイレクト)」で、元のURL→新しいURLの転送を301で1本追加する
  2. ログアウトしたブラウザ(シークレットウィンドウでもOK)で元のURLを開いて、新しい記事に着くか見る
  3. 着いたのを見てから、元の記事を下書きに戻す

「301が返った」だけでは合格にせん

301の番号だけ見ると合格に見えるが、転送先まで確認するとトップページ行きは不合格になる比較表
番号だけだと転送ミスも見逃す

転送を入れたら、全部のURLを実際に開いて確かめます。ここで引っかかりやすいのが、「301が返ってきたからOK」という見方です。

このサイトでは、存在しないURLも301を返します。行き先がトップページなだけで、番号は同じ301。つまり転送が1本も効いてへんくても、「全部301でした」と言えてしまうんです。

なので見るのは番号やなく、転送先(Locationヘッダ)が狙ったURLと1文字違わず一致するか。これを全部のURLで、ログアウトした状態(読者と同じ条件)で確かめました。

確認の仕組み自体も、先にテストしました。わざと存在しないURLを混ぜて、ちゃんと「不合格」と言うかどうか。言わんかったら、その確認は飾りです。

つまずく所:英数字以外のスラッグと、移したあとのスラッグ変更

転送を入れた直後の確認で、一部だけ転送が効いてませんでした。どれも、スラッグ(URLの末尾の名前)に英数字以外の文字が入った記事です。

URLの中の英数字以外の文字は、「%E4%B8…」のような記号の並びに変換されて書かれます。転送元をその形で登録しとったら、1本も当たらんかった。いろいろ試して分かったのは、Rank Mathはアクセスされたアドレスを元の文字に戻してから比べとる、ということ。転送元を元の文字のまま登録し直したら、ちゃんと効きました。

この直し方も、いきなり全部まとめてはやってません。1本だけ直して、直さん1本と並べて確かめてから残りに入れました。外れてもゴミが1本で済むように。

もう1つ、移し終わったあとに気をつけることがあります。転送は「古いURL→新しいURL」の組で登録しとるので、あとから新しい記事のスラッグを変えると、転送は行き先を失います。404をトップへ飛ばす設定のサイトやと、古いURLも新しいURLも、両方トップページへ飛ぶだけ。エラーは出えへんので、気づきにくいんです。転送先の記事のスラッグを変えたら、転送も一緒に直す。移したあとも、ここは気にしておくところです。

あと、転送があるからリンクは切れません。けど記事の中のリンクが古いURLのままやと、読者は毎回1回遠回りします。今回は記事の中の古いURLへのリンクも、新しいURLへ張り替えました。

よくある質問

元の記事は削除せず非公開でもいい?

今回は下書きに戻しました。転送は記事の公開状態とは関係なく効くので、読者(ログインしてへん人)は新しい記事へ届きます。削除やゴミ箱と違って、戻したい時に公開へ切り替えるだけで済むのが理由です。ゴミ箱に入れた記事はスラッグを握ったまま残ることもあります。

301リダイレクトはいつまで残しておく?

Googleのサイト移転のガイドでは、転送はできるだけ長く、一般的には1年以上残すよう書かれてます。その間に、外のサイトからのリンクなども新しいURLへ引き継がれていきます。すぐ消す理由が無いなら、残しておくのが安全です。

.htaccessとRedirectionプラグイン、どっちで設定する?

今回はどっちも使わず、すでに転送を管理しとったRank Mathに寄せました。先に「このサイトで今、何が転送しとるか」を調べるのがおすすめです。置き場所が2つになると、どっちが効いとるか追えんくなります。

「記事を移したいけど、転送まわりが怖くて手が出えへん」という場合は、ココナラでWordPressの表示崩れ・不具合修正のサービスもやってます。相談だけでもどうぞ。

あわせて読みたい