301-vs-302-vs-307-vs-308-redirect-guide-2026.html
< BACK

301 vs 302 vs 307 vs 308: SEO移行に向けたリダイレクトコード判断マトリックス

4つのHTTPリダイレクトコード、意味のある4つの異なる動作、そしてすべての移行で現れる一貫したSEOの誤り: フレームワークがデフォルトで出力する302を使用するというデフォルト動作。301 vs 302 vs 307 vs 308の実際の判断マトリックス、および誤った選択の実際のコストはこちら。

4つのコードを1文ずつで説明

301 Moved Permanently: 標準的な永続リダイレクト。キャッシュ可能。メソッドはPOSTからGETに変更される場合がある。URLの永続的な移動に向けたデフォルト。

302 Found: 一時的なリダイレクト。キャッシュ可能だが再検証が必要。メソッドはPOSTからGETに変更される場合がある。フレームワークがデフォルトとして使用。SEOの永続的な移動に対してはほぼ正しい選択肢ではない。

307 Temporary Redirect: 302のようだがメソッドが保持される。POSTはPOSTのまま。メソッド保持が重要な一時的な移動に使用(マーケティングサイトのSEOではまれ、APIでは一般的)。

308 Permanent Redirect: 301のようだがメソッドが保持される。POSTはPOSTのまま。メソッド保持が必要な場合の301の代替となるHTTP/2時代のコード。モダンフレームワーク(Next.js、Vercel)はredirect()呼び出しに対してデフォルトで308を出力。

SEOにおいて重要な理由

Googleは公開で、301と308の両方が完全なPageRankシグナルを転送すると述べています。302と307は信頼性が低く、一時的なリダイレクトは一時的な宛先を指すという解釈がGoogleに組み込まれているため、正規シグナルは元のURLに留まるべきというのが前提です。マイグレーションの場合、これは正確に言うと間違っています。正規シグナルを移動させたいのです。

実際の影響:301の代わりに302でマイグレーションリダイレクトを実装したサイトは、カットオーバー後の最初の60日間で通常、オーガニックトラフィックの20~40%を失います。修正は複雑ではありませんが、302はユーザーにとって機能するため(ブラウザが従う、ページが読み込まれる)、常に検出されるとは限りません。Search Consoleはカバレッジレポートの「リダイレクト付きページ」でこの問題にフラグを立てますが、ほとんどのチームはカットオーバー後のパニック時にそのレポートを無視します。

判定マトリクス

3つの質問があります。順序立てて答えてください。結果によってコードが決まります。

質問1:このMove(移行)は永続的ですか?

はい(URLは永遠に移動し、元のURLは戻らない)の場合:301または308を使用してください。いいえ(URLは戻る、これは一時的)の場合:302または307を使用してください。

質問2:URLはPOSTリクエストを受け取っていますか?

はい(フォーム送信、APIコール、JSON POST)の場合:307または308を使用してください(メソッド保存)。いいえ(ブラウザナビゲーション、リンククリック)の場合:302または301で問題ありません。

質問3:フレームワークのデフォルトは何ですか?

モダンスタック:Next.jsのredirect()はデフォルトで308を発行、vercel.jsonの[[redirects]]はpermanent: falseが設定されない限り308を使用、Netlifyの_redirectsは明示的に指定されない限り301を使用。Apache mod_rewriteはデフォルトで302を使用するため、最初は誰もが引っかかる。フレームワークのデフォルトに頼る前に必ず確認すること。

最も一般的な4つの間違い

  • Apache/Express/Flaskがredirect()ヘルパーのデフォルトとして302を発行することを理由にデフォルトで302を使用する。対策:恒久的な移動時には、すべてのリダイレクトルールで301を明示的に設定する。
  • 307を最新の301だと考えて使用する。それは違う — 307は最新の302(一時的、メソッド保持)である。恒久的な移動には308または301を使用する。
  • 同じリダイレクトマップ全体で301と302を混在させる。1つを選択し(移行の場合は301)、すべての場所で使用する;混在したコードはSearch Consoleのレポートを混乱させる。
  • 308がPOSTメソッドを保持することを忘れる。古いURLがフォーム送信エンドポイントで、それを308で新しいURLにリダイレクトすると、POSTデータが流れる。301でリダイレクトすると、ブラウザはPOSTをGETに変換し、フォーム送信が失われる。この違いを知ることで、実際のバグクラスを防ぐことができる。

実際にはどの場合にどれを使用するか

移行リダイレクト(旧ドメイン→新ドメイン、旧スラッグ→新スラッグ):301を使用する。最も単純で広くサポートされており、Googleによってページランク転送の完全な移行として明示的に記載されている。

メソッド保持が重要な恒久的な移動(POSTエンドポイント、フォーム送信):308を使用する。ページランク転送は301と同じ;唯一の違いはPOSTがPOSTのままということ。

一時的な移動(A/Bテスト、地理的リダイレクト、メンテナンス):302を使用する。ページランク転送の低さは正しい動作である;ソースURLは順位シグナルを保持すべきだから。

メソッド保持によるテンポラリー移動(一時フェイルオーバー下のAPIエンドポイント):307を使用します。

一般的なプラットフォーム上で各コードを設定する方法

Vercel(vercel.json)

[[redirects]]ブロック。permanent: trueを308に設定(デフォルト)、permanent: falseを307に設定します。301を強制する場合はstatusCode: 301を明示的に指定してください。最新のVercelデプロイメントはデフォルトで308を使用するため、マイグレーション時は問題ありません。SEO保守的な選択は301で、古いクローラーとインデクサーとの最大互換性を得られます。

Netlify(netlify.tomlまたは_redirects)

_redirects構文:永続的な場合は/old-url /new-url 301、テンポラリーの場合は/old-url /new-url 302。ステータスを強制するには!を追加します:/old-url /new-url 301!。

Apache(.htaccess)

永続的な場合はRedirect 301 /old-url /new-url。リライトスタイルのリダイレクトの場合はRewriteRuleに[R=301,L]フラグを使用します。

Nginx

ロケーションブロック内でreturn 301 https://example.com/new-url;を使用します。パターンマッチングの場合:rewrite ^/old/(.*)$ /new/$1 permanent;(permanentフラグは301を発行、redirectフラグは302を発行)。

本番環境でコードを検証する

すべてのエンジニアが筋肉記憶に保つべき3つのコマンド。curl -I https://example.com/old-url はレスポンスヘッダーのステータスコードを返す。curl -ILk はリダイレクトをたどり、すべてのステータスコードをログに記録する(チェーンを捕捉する)。

数百のURLにわたる大規模検証の場合、スクリプト可能:古いURLのCSVを読み込み、ステータスと最終的な宛先をログに記録するNode.jsフェッチループ。あるいはDataForSEOのon-page Instant Pagesエンドポイントを使用。リダイレクトトレース全体を返す。

まとめ

恒久的な移動には301(SEOマイグレーションのデフォルト)。メソッド保持が重要で移動が恒久的な場合は308。一時的な移動には302。メソッド保持が必要な一時的な移動には307。フレームワークのデフォルトは常に正しいわけではない。デプロイ時に確認すること。

関連読み物:410対404は廃止のケースをカバー(URLが永遠に消滅し、移動ではない)。通常、同じマイグレーションには両方の判断が必要。

< BACK