一時リダイレクト(302/303/307)の違いとSEO対策 — メソッド保持・キャッシュ・実装のベストプラクティス

一時リダイレクトとは

一時リダイレクト(temporary redirect)は、あるURLへのリクエストを別のURLへ一時的に転送するための仕組みです。HTTPレスポンスの3xx系ステータスコードを用いて実現され、代表的なものに「302 Found」「303 See Other」「307 Temporary Redirect」があります。これらは「恒久的に移動した(301)」とは異なり、転送の意図が一時的であることを示します。

主要なステータスコードの違い

  • 302 Found:歴史的に意味が曖昧で、ユーザーエージェントによってはPOSTをGETに変更するなど挙動が異なる場合がある古典的な一時リダイレクト。
  • 303 See Other:POSTなどの非GETメソッドの後に「結果は別のURI(GET)で取得せよ」と明示するためのコード。POST→GET に変換されることを期待する場合に使う。
  • 307 Temporary Redirect:クライアントに対して「同じHTTPメソッドを保持して別のURIにアクセスせよ」と指示する一時的リダイレクト。メソッドやボディを変更したくないAPI等に適する。

これらの意味と振る舞いは、仕様書(RFC)やブラウザの実装に依存します。現代では意味を明確にした303/307を選ぶ方が望ましいことが多いです。

メソッドの保持・変更に関するポイント

  • 302は歴史的な経緯で一部のクライアントがPOSTをGETに変えてしまうことがあるため、厳密な動作を期待するなら避ける場合がある。
  • 303は「常にGETでアクセスし直す」ことを意図しているため、POSTの結果表示ページにリダイレクトする際に適切。
  • 307は「リダイレクト後も同じメソッド(例えばPOST)を使う」ことを保証するので、REST APIなどで推奨される場面がある。

キャッシュと有効期限

一時リダイレクトでもキャッシュされる可能性があるため、キャッシュの制御は重要です。レスポンスに

  • Cache-Control: no-cache, no-store, must-revalidate
  • Expires: 0

などを付ければ、ブラウザや中間キャッシュに長期間保存されるのを防げます。逆に「短期間だけキャッシュしてよい」場合は適切なmax-ageを設定します。なお、恒久的に移転したい場合は301を用いると検索エンジン側で恒久移転として扱われることが多いです。

SEO(検索エンジン最適化)への影響

一般に、301(恒久的)リダイレクトはリンク評価(いわゆる“リンクエクイティ”)を新しいURLに引き継ぐとされています。一方、302などの一時リダイレクトは基本的に「元のURLが将来戻る可能性がある」と検索エンジンに伝えるため、評価を移さない/一時的に扱う場合があります。

ただし実運用では検索エンジン(例:Google)は状況に応じて302を恒久的だと解釈することもあります。長期間同一のリダイレクトが続く場合は、検索エンジンが301に類似した扱いをする可能性があるため、意図が恒久であれば最初から301を使うのが確実です。

実装方法(例)

以下は代表的な環境での実装例です。

  • Apache(mod_alias): Redirect 302 /old-path https://example.com/new-path
  • Apache(mod_rewrite): RewriteRule ^old-path$ https://example.com/new-path [R=302,L]
  • Nginx: return 302 https://example.com/new-path;(メソッドを保持したい場合は return 307
  • PHP: header("Location: https://example.com/new-path", true, 302); exit;
  • WordPress: wp_redirect( $location, 302 ); exit;(デフォルトのステータスは302。安全性チェック付きは wp_safe_redirect
  • HTML/JS(非推奨だが補助的): メタリフレッシュや window.location.replace() を使う(検索エンジンやユーザーにとって挙動が不確実なので注意)。

REST API と一時リダイレクト

APIではメソッドやリクエストボディを重要視するため、リダイレクトの際にメソッドが変わると予期せぬ不具合を招きます。そのためAPIで一時的に別エンドポイントへ転送する必要がある場合は、メソッドを保持する 307 Temporary Redirect を使うのが適切です。POSTをGETに変換してしまうとデータ損失や仕様違反になります。

運用上の注意点とベストプラクティス

  • 意図が「一時的」であれば一時リダイレクトを使い、恒久的移転なら301を使う。
  • POST→結果ページの遷移には303を検討する(ユーザーがブラウザのリロードで再POSTしてしまうのを防ぐ)。
  • リダイレクトチェーン(A→B→C)は避ける。チェーンはパフォーマンス低下とクローラの評価低下を招く。
  • リダイレクトループ(A→B→A)は絶対に避ける。自動テストやcurlで検証する。
  • Locationヘッダには可能なら絶対URLを指定する。相対URLも有効な場合はあるが実装依存の挙動に注意。
  • キャッシュ制御ヘッダを適切に付与して、ブラウザやCDNに望ましい挙動を指示する。
  • Search Consoleやサーバログで頻度を監視し、長期間の「一時」扱いは見直す。

確認とデバッグ方法

  • curlでヘッダ確認: curl -I -L https://example.com/old-path(-Iはヘッダのみ、-Lはリダイレクト追従)。
  • ブラウザの開発者ツールでNetworkタブを使い、実際のステータスとLocationヘッダ、キャッシュヘッダを確認。
  • サーバログ(アクセスログ)でクライアントの挙動とステータスコードをチェック。

まとめ

一時リダイレクトは「現在は別の場所にあるが将来元に戻るかもしれない」ことを示すための重要な手段です。302、303、307など用途ごとの意味を理解し、目的に合わせたステータスコードとキャッシュ制御を設定することが肝要です。特にAPIやPOST処理においてはメソッド保持の可否が重要になるため、307や303を適切に選択してください。検索エンジンやキャッシュの挙動も考慮し、恒久的な移転であれば301を使うのが確実です。

参考文献