URLを変えると出てくる「301」。
何を確認すればいいのかを、このブログの例で説明します。
このブログでは、カテゴリのURLを変えたあと、古いURLが200のまま表示されていました。
301の意味と、WordPressが自動で転送する範囲を、その例も交えてまとめます。
301って、結局なに?
古いURLを開いた人を、新しいURLに案内する転送のことだよ。
301リダイレクトとは?古いURLから新しいURLへの、恒久的な転送
301は、HTTPのステータスコードのひとつです。
正式な名前は「301 Moved Permanently」。
リクエストされたページが、別のURLへ恒久的に移動した、という意味です。
大事なのは「恒久的」という言葉です。
ブラウザは、サーバーが返した転送先のURLを読み取って、そのURLのページを自動で開き直します。
開いた人から見ると、古いURLを入力したのに、気づいたら新しいURLのページが出ている状態です。
引っ越し先の案内、というイメージです。
転送処理を追加したあと、Claude Codeに確認してもらうと、このブログでは次のURLが301で転送されていました。
古いカテゴリのURLを開くと、こうなります。
/category/tools/tools-ai/→/category/tools-ai/
このブログのトップページは、https://cats-hand.pro/もhttps://www.cats-hand.pro/も、https://cats-hand.pro/へ301で転送されました。
URLの形が何通りかあっても、アクセスした人にも検索エンジンにも、見せたい形のURLにまとめて伝えるために使われています。
どんなときに出てくる?
301が必要になる場面は、だいたい3つ。
- 記事やページのURL(スラッグ)を変えたとき
- カテゴリの親子を変えるなどして、一覧ページのURLが変わったとき
httpからhttpsへ、またはwwwの有無など、サイトのURLの形を統一したいとき
どれも、「古いURLを知っている人や検索エンジンを、新しいURLへ案内したい」という場面です。
URLが変わるなら、301の出番。
302や308との違い
転送には、301のほかにも種類があります。
基本の違いは、次のとおりです。
- 301: 恒久的な転送。ずっと新しいURLに移ったときに使う
- 302: 一時的な転送。メンテナンス中だけ別のページへ、といった場面で使う
- 308: 301と同じ恒久的な転送。ただし転送後も、リクエストの方法(メソッド)を変えない
検索エンジンも、恒久的な転送と一時的な転送を区別します。
Googleのドキュメントによると、301や308のような恒久的な転送は、転送先を正規のURLにするためのシグナルとして使われます。
302のような一時的な転送は、そうしたシグナルとしては扱われません。
元のURLが、インデックスに残る場合があります。
使い分けの基準は、元のURLに戻すかどうかです。
なので、URLを変えて元に戻さないなら、301です。
記事などを恒久的に移すだけで、POSTのメソッドを維持する必要がなければ、301で十分です。
MDNによると、POSTへの301では、転送後のリクエストがGETに変わります。
変えたくないときは308を使います。
302でもページは見られるんじゃないの?
302でも転送先は表示されるよ。
ただ、Googleは302を転送先を正規URLにする合図としては扱わないんだ。
WordPressでは、どこまで自動で転送される?
WordPressは、全部の変更を自動で転送してくれるわけではありません。
記事のスラッグを変えたとき
通常の投稿では、スラッグを変えたあと古いURLが404になるなど条件が合えば、WordPressが新しいURLへ301で転送します。
公式ドキュメントによると、この転送をしているのはwp_old_slug_redirect()という関数で、古いスラッグから今の正しいパーマリンクへ、301で案内します。
動くのは、ページが見つからない状態になっていて、スラッグが存在し、階層のない投稿タイプのときです。
固定ページのような階層のある投稿タイプは対象外、とされています。
カテゴリの親子を変えたとき
カテゴリの親子を変えたときは、このブログでは、古いURLが転送されませんでした。
古い/category/tools/tools-ai/が、ステータス200のまま表示されていたんです。
このブログではカテゴリの旧URLが転送されなかったので、転送の処理をClaude Codeにテーマへ追加してもらいました。
WordPressで301を設定する選択肢
WordPressで設定するなら、次の3つが使えます。
- テーマのPHPで、条件を決めて転送する(
wp_safe_redirect()を301で使う) - サーバーの設定ファイル(
.htaccessなど)に書く - Redirectionのような転送用プラグインで、古いURLを1件ずつ登録する
Googleのドキュメントも、PHPのヘッダーやApacheの設定、NGINXの設定のように、サーバー側で行う転送を推奨しています。
サーバー側で設定できないときはmeta refresh、JavaScriptでの転送は最後の手段、とされています。
このブログでは、Claude Codeに依頼して、カテゴリの転送処理をPHPでテーマに追加してもらいました。
アクセスされたURLと、そのカテゴリの今のURLを比べて、違えば301で転送する形です。
古いURLを1件ずつ書かないので、ほかのカテゴリの親子を変えた場合にも使えます。.htaccessなどの設定ファイルを直接編集したくないなら、プラグインの管理画面で転送元と転送先を登録できます。
Redirectionは、無料のプラグインです。
公式の説明では、手順はこうです。
- プラグインを有効化して、管理画面の「ツール」からRedirectionを開く
- 新しい転送を追加して、転送元のURL(Source URL)と、転送先のURL(Target URL)を入力する
- HTTPコードで301を選んで、保存する
- 古いURLを開いて、新しいURLへ移るか確認する
301でハマった例
転送されるはずなのに、されていなかった例です。
ページが表示されても、301で転送されたのか、古いURLが200のまま表示されたのかは見た目で分かりません。
なので、curl -Iでステータスを見たり、ブラウザの開発者ツールの「ネットワーク」で確認したりします。
詳しくはWordPressのカテゴリを親子変更したら古いURLでも表示された原因と301転送に書いています。
迷ったときの確認ポイント
- 恒久的にURLを変えたら、古いURLの応答が301か確認する(ブラウザの開発者ツールの「ネットワーク」などで見られます)
- 恒久的な引っ越しなら301、一時的なら302を選ぶ
- 転送先が、さらに別のURLへ転送されない、最終的なURLになっているか見る
- WordPressが自動で転送するのは、通常の投稿の古いスラッグなど。カテゴリの親子変更は転送されなかったので、自分で確認する
URLを変えるなら、転送まで一緒に決めておく。
あわせて知っておきたい用語
- スラッグ
- 記事やカテゴリのURLに入る識別名。変えるとURLも変わります。
- パーマリンク
- 記事などに割り当てられる、変えない前提のURL。形はWordPressの「パーマリンク設定」で決めます。
- 302(リダイレクト)
- 一時的な転送のこと。元のURLに戻す前提のときに使います。