リダイレクト 302とは?301 との違いを徹底解説!初心者でもわかるリダイレクトの種類と使い分け
目次
リダイレクトって何?なぜ必要なの?
Webサイトを運営していると、ページのURLを変更したり、サイト全体を新しいドメインに移転したりする場面があります。また、一時的にメンテナンスを行うためにユーザーを別のページに誘導したいこともあるでしょう。
そんなとき活躍するのが「リダイレクト」です。
リダイレクトとは、ユーザーがあるURLにアクセスしたときに、自動的に別のURLへ転送する仕組みのことです。例えば、古いページから新しいページへユーザーを自動的に誘導することができます。
しかし、リダイレクトにもいくつかの種類があり、どのような状況でどのリダイレクトを使うべきかによって選択が変わってきます。
この記事では、301、302、303、307、308などのリダイレクトの違いと適切な使い分け方について、初心者の方にもわかりやすく解説します。
リダイレクトの基本と仕組み
リダイレクトが行われるとき、実際には以下のような流れで処理が進みます:
- ユーザーがブラウザでURLを入力するか、リンクをクリックします
- サーバーがそのリクエストを受け取ります
- サーバーは「このURLは別のURLに転送されるべきだ」と判断します
- サーバーはブラウザに「別のURLへアクセスしてください」という指示と共に、リダイレクトの種類を示すステータスコード(301や302など)を送ります
- ブラウザはその指示に従って新しいURLにアクセスします
この一連の流れは通常、ユーザーからは気づかれないほど素早く行われます。画面が切り替わる瞬間に少し時間がかかる程度です。
それでは、代表的なリダイレクトの種類とその違いについて見ていきましょう。
リダイレクトの種類と違い
301リダイレクト:恒久的な転送
意味合い:恒久的なリダイレクト処理を行うときに指定します。
どういうときに使う?:これから先ずっとこっちのURLを使います!というときに使いましょう。
使うシーン:
- 新しいドメインにサイトを移転し、内容を引き継いでの運用
- ページのURL構造を恒久的に変更した場合
- 複数のURLを一つのURLに統合する場合
301リダイレクトの大きな特徴は、SEOの評価(ページランクなど)が新しいURLに引き継がれることです。そのため、サイトの移転やURL変更を行う際には、SEO対策として重要な役割を果たします。
302リダイレクト:一時的な転送
意味合い:一時的なリダイレクト処理を行うときに指定します。
どういうときに使う?:しばらくの間だけこっちのURLにアクセスしてくださいというときに使いましょう。
使うシーン:
- サイトのメンテナンス中に一時的に別ページを表示
- キャンペーンなど期間限定のページへの誘導
- テスト目的での一時的なURL変更
302リダイレクトはページの評価が元のURLに残るため、一時的な変更の際に適しています。
303リダイレクト:GETメソッドへの転送
意味合い:一時的なリダイレクト処理を行い、なおかつリダイレクト先にはGETメソッドでアクセスします。
どういうときに使う?:一時的なリダイレクトかつGETメソッドでリダイレクトする場合に使いましょう。
使うシーン:
- フォーム送信(POSTメソッド)後に確認ページや完了ページへリダイレクトする場合
- POST処理完了後に別のページへユーザーを誘導したい場合
303リダイレクトは特にフォーム送信後の処理で重要です。POST送信後にリロードするとフォームが再送信されることがありますが、303リダイレクトを使うとそれを防ぐことができます。
307リダイレクト:メソッドを保持した一時的転送
意味合い:一時的なリダイレクト処理を行い、元のリクエストメソッド(GETやPOST)を保持したままリダイレクトします。
どういうときに使う?:一時的なリダイレクトでかつメソッドを引き継ぎたい場合に使いましょう。
使うシーン:
- APIのエンドポイントを一時的に変更する場合
- POSTメソッドを維持したまま別のスクリプトに処理を引き継ぎたい場合
- フォームデータをそのまま別のURLに転送したい場合
307リダイレクトは302と似ていますが、HTTP/1.1で導入された明確なメソッド保持の仕組みを持っています。
308リダイレクト:メソッドを保持した恒久的転送
意味合い:恒久的なリダイレクト処理を行い、元のリクエストメソッドを保持したままリダイレクトします。
どういうときに使う?:永続的なリダイレクトでかつ元のメソッドを引き継ぎたい場合に使います。
使うシーン:
- APIのエンドポイントを恒久的に変更する場合
- POSTリクエストを受け付けるURLを永続的に変更する場合
308リダイレクトは比較的新しく、301の「メソッドを保持する版」と考えるとわかりやすいでしょう。
302と303、307との違い
302、303、307はすべて一時的なリダイレクトですが、細かな違いがあります:
- 302:HTTP/1.0から存在する古い仕様で、厳密にはメソッド変更の動作がブラウザに依存します
- 303:必ずGETメソッドでリダイレクトします(POST→GETに変換)
- 307:リクエストメソッドをそのまま引き継ぎます(POSTはPOSTのまま)
つまり、フォーム送信後に確認ページに移動させたい場合は303が最適で、POSTリクエストをそのまま別スクリプトに引き継ぎたい場合は307が適しています。
301リダイレクトを使う際の注意点
301リダイレクトは「恒久的」という意味合いを持つため、設定後に元に戻すことが難しい場合があります。その理由は:
- ブラウザがキャッシュに保存する傾向があり、キャッシュをクリアしない限り元のURLへのアクセスを試みなくなる
- 検索エンジンが新しいURLをインデックスし、古いURLを削除する可能性がある
したがって、本当に恒久的な変更でない場合は、まずは302リダイレクトを使用し、問題がないことを確認してから301に変更するという慎重なアプローチが推奨されます。
参考記事:気をつけないと怖いかも?301 リダイレクトはブラウザ上でキャッシュされますよって話
リダイレクトの適切な使い分け方
サイト移転・ドメイン変更時
- 新しいドメインに完全移転する場合:301リダイレクト
- ドメイン変更を試験的に行う場合:302リダイレクト(確定後に301に変更)
- APIなどPOSTリクエストを使用する機能を移転する場合:308リダイレクト
メンテナンス時
- 一時的なメンテナンス中のページ表示:302リダイレクト
- メンテナンス中でもAPIの機能を維持したい場合:307リダイレクト
フォーム送信後
- フォーム送信後に確認・完了ページに移動:303リダイレクト
- フォームデータを別の処理スクリプトに引き継ぎたい場合:307リダイレクト
リダイレクトの設定方法(簡単な例)
.htaccessでの設定例(Apache)
# 301リダイレクト(恒久的)
Redirect 301 /old-page.html https://www.example.com/new-page.html
# 302リダイレクト(一時的)
Redirect 302 /temporary-page.html https://www.example.com/alternative-page.html
# 303リダイレクト
RewriteEngine On
RewriteRule ^form-processed$ /thank-you-page.html [R=303,L]
# 307リダイレクト
RewriteRule ^api/v1/(.*)$ /api/v2/$1 [R=307,L]
# 308リダイレクト
RewriteRule ^old-api/(.*)$ /new-api/$1 [R=308,L]
PHPでの設定例
// 301リダイレクト
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://www.example.com/new-page.html");
exit;
// 302リダイレクト
header("Location: https://www.example.com/temporary-page.html");
exit;
// 303リダイレクト
header("HTTP/1.1 303 See Other");
header("Location: https://www.example.com/thank-you-page.html");
exit;
// 307リダイレクト
header("HTTP/1.1 307 Temporary Redirect");
header("Location: https://www.example.com/api/v2/endpoint");
exit;
// 308リダイレクト
header("HTTP/1.1 308 Permanent Redirect");
header("Location: https://www.example.com/new-api/endpoint");
exit;
まとめ:どのリダイレクトを選ぶべきか
リダイレクトの選択は、以下の2つの質問に答えることで簡単に判断できます。
- 変更は恒久的?それとも一時的?
- 恒久的 → 301か308
- 一時的 → 302、303、307
- リクエストメソッドの扱いはどうする?
- メソッドを保持(POSTはPOSTのまま) → 307(一時的)または308(恒久的)
- 必ずGETメソッドに変換 → 303
- 特に指定なし/ブラウザ任せ → 301(恒久的)または302(一時的)
ただし、ドメイン変更などの重要な変更を行う場合は、まずは302(一時的)で設定し、問題がないことを確認してから301(恒久的)に変更するという慎重なアプローチがおすすめです。
リダイレクトは適切に設定することで、ユーザー体験を損なわずにサイトの変更や移転を行うことができます。また、SEO評価を保持するためにも重要な役割を果たします。ぜひ状況に応じて適切なリダイレクトを選択してください。