【入門編】 HTTPステータスコード 3xx (リダイレクト系) とLocationヘッダー – ネットワーク基礎とWebセキュリティ実践ガイド

こんにちは!技術メディアの主筆ライターであり、日々ネットワークパケットの海を泳いでいるセキュリティスペシャリストです。

普段、私たちが何気なくスマートフォンやパソコンでWebサイトを見ているとき、アドレスバーのURLが一瞬で「シュッ」と切り替わり、自動的に別のページに移動した経験はありませんか?

「あれ? 違うページを開いたはずなのに、お目当てのページに自動的に案内されたぞ?」

これこそが、今回ご紹介する「HTTPリダイレクト」という魔法のような仕組みです。

インフラやネットワークの世界に一歩を踏み出したばかりの皆さんにとって、Webの裏側で行われているデータのやり取りは、まるで目に見えない呪文のように思えるかもしれません。でも、安心してください!
今回は、難しいビット数や複雑なパケット構造の話は一切抜きにして、私たちの身近な「郵便配達」や「お引っ越し」の仕組みに例えながら、一歩ずつ丁寧に紐解いていきましょう!

—

1. Webの世界の「転送届」:リダイレクトと Location ヘッダー

まずは、リダイレクトの基本的な仕組みを現実世界に置き換えて考えてみましょう。

あなたが、お気に入りのパン屋さん「ベーカリー・アンカー」にお手紙(リクエスト)を送ったとします。しかし、そのパン屋さんは少し前に、別の場所へお引っ越しをしていました。

もし、郵便局やパン屋さんが何も対応していなければ、あなたのお手紙は「宛先不明」として戻ってきてしまいますよね。
そこでパン屋さんは、郵便局に「転送届」を出しておきました。

1. あなたが「旧住所」へお手紙を送る。
2. 郵便局(Webサーバー)は、「あ、このお店は移転したよ! 新しい住所はここだよ」と書かれたメモ(レスポンス)をあなたに返します。
3. あなたはそのメモを見て、「なるほど!」と納得し、今度は自動的に「新住所」へお手紙を送り直します。

この一連の自動的なやり取りこそが、Webにおける「リダイレクト(転送)」です。

Location ヘッダーは「新しい住所が書かれたメモ」

Webの世界では、この「新しい住所が書かれたメモ」のことを Location ヘッダー と呼びます。

ブラウザ(ChromeやSafariなど)がWebサーバーにアクセスした際、サーバーから「ここじゃないよ」という合図と一緒に、この Location ヘッダーが送られてきます。

HTTP/1.1 301 Moved Permanently
Location: https://new-bakery.example.com/

ブラウザはこの Location という文字を見つけると、瞬時に「あ、https://new-bakery.example.com/ に行けばいいんだな!」と理解し、ユーザーが何も操作しなくても、自動的に新しいURLへアクセスし直してくれるのです。

—

2. 似ているけれど大違い! 301 と 302 の決定的な差

リダイレクトを指示するとき、Webサーバーは「3桁の数字」をブラウザに返します。これが「HTTPステータスコード」と呼ばれるものです。
特にリダイレクトを表すのは 3xx(300番台)の数字たちですが、実務で最もよく使うのが 301 と 302 です。

この2つ、ブラウザの画面上の動きは全く同じに見えますが、裏側の意味合いは「180度」異なります。ここをしっかり整理しておきましょう!

① 301 Moved Permanently (永久的なお引っ越し)

301 は、その名の通り「永久に(Permanently)移動しました」という意味です。

  • 現実世界での例え:

一戸建てのマイホームを購入し、完全に住民票も移して「もう元の場所には一生戻りません!」という本気のお引っ越しです。

  • ブラウザの挙動:

ブラウザは「この古いURLは、もう二度と使われないんだな」と学習します。そして、新しいURLを自分の記憶(キャッシュ)にしっかりと保存します。次回からは、古いURLを入力しても、サーバーに「どこに移転したの?」と聞くことすら省略して、一発で新しいURLにアクセスするようになります。

  • SEO(検索エンジン)への影響:

Googleなどの検索エンジンも、「古いページの評価(人気度や信頼性)」をそのまま新しいページへと引き継いでくれます。

② 302 Found (一時的なお出かけ・仮店舗)

一方の 302 は、「一時的に(Temporary)別の場所にあります」という意味です。

  • 現実世界での例え:

「お店の改装工事の間だけ、3軒隣の仮店舗で営業します! 工事が終わったら元の場所に戻りますよ」という一時的な避難です。

  • ブラウザの挙動:

ブラウザは「今は一時的にあっちにいるんだな」と理解します。しかし、元に戻る可能性があるため、新しいURLを「永久保存(キャッシュ)」はしません。次回アクセスするときも、必ず一度古いURLにアクセスして、状況を確認します。

  • SEOへの影響:

検索エンジンは、古いページの評価をそのまま維持します。新しいページはあくまで「一時的なもの」として扱われます。

| ステータスコード | 英語の意味 | 日本語の意味 | ブラウザのキャッシュ | 主な用途 |
| :— | :— | :— | :— | :— |
| 301 | Moved Permanently | 永久的な移動 | する(次回から直接新URLへ) | サイト全体のドメイン変更、URLの恒久的な統合 |
| 302 | Found(旧 Moved Temporarily) | 一時的な移動 | しない(毎回元のURLを確認する) | キャンペーン期間中の特設ページへの誘導、メンテナンス中の迂回 |

—

3. 実践!Webサーバーやプログラムでリダイレクトを設定してみよう

では、実際にインフラエンジニアやWebディベロッパーが現場でどのようにこのリダイレクトを設定しているのか、具体的なコード例を見てみましょう。

パターンA:Webサーバー(Nginx)で設定する場合

インフラ構築でよく使われる高性能なWebサーバー Nginx(エンジンエックス)の設定ファイルでの書き方です。

# Nginxの設定ファイルの一部です

# 1. 永久的なリダイレクト (301) の設定例
server {
    listen 80;
    server_name old-bakery.example.com;

    # アクセスしてきた人全員を、新サイトへ「永久転送」します
    # 行末の「permanent」が「301」を出力する合図です
    return 301 https://new-bakery.example.com$request_uri;
}

# 2. 一時的なリダイレクト (302) の設定例
server {
    listen 80;
    server_name shop.example.com;

    # メンテナンス中だけ、一時的に特設ページへ飛ばします
    # 行末の「redirect」が「302」を出力する合図です
    location /products {
        return 302 https://maintenance.example.com/info.html;
    }
}

パターンB:Webアプリケーション(Python / Flask)で設定する場合

次に、Webアプリケーションのプログラム側でコントロールする例です。今回は初心者にも人気の軽量フレームワーク Flask(フラスク)を使ってみます。

from flask import Flask, redirect, url_for

app = Flask(__name__)

# 古いお買いものページにアクセスがあった場合
@app.route('/old-shop')
def old_shop():
    # redirect()関数を使い、Locationヘッダーに新しいURLを指定します
    # code=301 を指定することで、「永久に移転したよ」とブラウザに伝えます
    return redirect("https://new-bakery.example.com/shop", code=301)

# キャンペーンページに一時的に飛ばしたい場合
@app.route('/event')
def event():
    # codeを指定しない場合、Flaskはデフォルトで「302(一時的)」として処理します
    return redirect("https://new-bakery.example.com/summer-sale")

if __name__ == '__main__':
    app.run()

—

4. 恐怖の「たらい回し」!リダイレクトループとその防止策

リダイレクトは非常に便利ですが、設定を一つ間違えると「リダイレクトループ」という、ネットワーク上の大渋滞(無限ループ)を引き起こしてしまいます。

リダイレクトループとは?

例えば、あなたが以下のような「矛盾した転送届」を出してしまったとします。

1. 郵便局に「A宛ての手紙は、Bに転送してください」と頼む。
2. 同時に「B宛ての手紙は、Aに転送してください」とも頼んでしまう。

これを受け取った配達員さんはどうなるでしょうか?
Aに行けば「Bへ行け」と言われ、Bに行けば「Aへ行け」と言われ、両者の間を無限に行ったり来たりすることになりますよね。

これがWebの世界で起きる「リダイレクトループ」です。

[ブラウザ] ----(Aをちょうだい)----> [サーバー]
[ブラウザ] <---(Bに行きなさい:302)--- [サーバー]
[ブラウザ] ----(じゃあBをちょうだい)--> [サーバー]
[ブラウザ] <---(Aに行きなさい:302)--- [サーバー]
[ブラウザ] ----(えっ、またA!?)-----> (無限ループ発生!)

ブラウザは、この無限のたらい回しを検知すると、ユーザーのパソコンやスマートフォンのメモリが爆発してしまわないように、途中で処理を強制ストップします。
そして、画面に「このページは動作していません(リダイレクトが多すぎます)」というエラー(Google Chromeでは ERR_TOO_MANY_REDIRECTS)を表示して諦めてしまうのです。

どうやって防ぐ?現場でのトラブルシューティング

もしあなたが構築したサイトでこのエラーが出てしまったら、以下のポイントを優しくチェックしてみましょう。

1. 「無限の往復」がないか設定を見直す
http://(暗号化なし)から https://(暗号化あり)へリダイレクトさせたいのに、https:// の設定側でも「http:// へ戻せ」という設定が残っていないか確認します。
2. Webサーバーとアプリケーションの役割分担
Webサーバー(Nginxなど)と、後ろで動くアプリケーション(PHPやPythonなど)の両方でリダイレクトを書いてしまい、お互いに押し付け合っていないか確認します。
3. ブラウザのキャッシュをクリアしてみる
先ほど解説した通り、301 はブラウザが「強力にキャッシュ(記憶)」します。設定ファイルを修正したのにエラーが消えない場合、ブラウザが昔の「間違っていたお引っ越し情報」を覚えたままになっているだけの可能性があります。シークレットモードで試すか、ブラウザのキャッシュをクリアしてみましょう!

—

まとめ:一歩ずつ、パケットの気持ちになってみよう

今回は、HTTPステータスコードの 3xx シリーズ、特に 301 と 302 の違い、そして Location ヘッダーが果たす役割について解説しました。

  • リダイレクトは、Webの世界の「自動転送システム」。
  • Location ヘッダーは、「次に進むべき新しい住所のメモ」。
  • 301 は「永久のお引っ越し」(ブラウザも検索エンジンも記憶する)。
  • 302 は「一時的なお出かけ」(ブラウザは記憶しない)。
  • 設定ミスによるリダイレクトループに注意する。

一見難しそうなネットワークのパケットやプロトコルも、こうして現実世界の郵便に置き換えてみると、とても人間味のある、よくできた仕組みであることが分かりますよね。

焦らず、一歩ずつ。パケットやブラウザがどんな気持ちでメッセージをやり取りしているのかを想像しながら、これからのインフラ・Web開発を楽しんでいきましょう!

また次回の記事でお会いしましょう。ネットワークセキュリティスペシャリストの私がお届けしました!

コメント

タイトルとURLをコピーしました