《PHP8上級試験対策》header()関数とLocationヘッダによるリダイレクトの仕組み

  • URLをコピーしました!

はじめに

PHPのheader()関数は、HTTPレスポンスヘッダを直接送信できる便利な関数です。
特に「Locationヘッダ」は、ブラウザに別のURLへ移動させる“リダイレクト”の仕組みを担っています。
この記事では、header('Location: ...) がどのように動作するのか、そして出力順序の注意点を含めて整理します。

キーワード: header / Location / HTTPレスポンスヘッダ / リダイレクト / headers already sent

目次

■ header()関数の基本

header()関数は、生のHTTPレスポンスヘッダを送信するための関数です。
その定義は以下の通りです。

header(string $header, bool $replace = true, int $response_code = 0): void
  • $header … 実際に送信するヘッダ内容
  • $replace … 同種ヘッダがすでに送信されている場合の上書き設定(デフォルトは true)
  • $response_code … HTTPステータスコードを任意指定(例:301, 404など)

■ Locationヘッダによるリダイレクト

次のように書くことで、ブラウザに「別のURLへ移動して」と指示できます。

<?php
declare(strict_types=1);
error_reporting(-1);

header('Location: https://www.phpexam.jp/');

これを ブラウザ経由で実行すると、サーバーからは次のようなレスポンスが返ります。

HTTP/1.1 302 Found
Location: https://www.phpexam.jp/

ブラウザはこのレスポンスを受け取り、自動的に https://www.phpexam.jp/ へ移動します。
この挙動こそが「リダイレクト」です。

⚠️ 注意点:出力を先に行うとエラーに

header() は「HTTPヘッダ送信前」にしか呼び出せません。もし、echovar_dump()などで出力をしてしまうと、すでにレスポンス本文が送信されているため、次のような警告が出ます。

Warning: Cannot modify header information - headers already sent by ...

これは非常によくある初学者トラップです。
header() は最初の出力より前に記述するのが鉄則です。

💡 補足:ステータスコードの指定

Location: は通常、HTTP 302(Found)が自動付与されます。
恒久的なリダイレクトにしたい場合は、以下のように301を明示指定します。

header('Location: https://www.phpexam.jp/', true, 301);

🖼 図解:リダイレクトの流れ

┌──────────────────────────────────┐
│ ① クライアントが test.php にアクセス │
└───────────────┬──────────────────┘
                │
                ▼
┌───────────────────────────────────────┐
│ ② サーバーがレスポンスを返す              │
│   HTTP/1.1 302 Found                  │
│   Location: https://www.phpexam.jp/   │
└───────────────┬───────────────────────┘
                │
                ▼
┌──────────────────────────────────────┐
│ ③ ブラウザがLocation先へ自動遷移        │
│   → https://www.phpexam.jp/ に移動    │
└──────────────────────────────────────┘

✅ まとめ

項目内容
関数header() はHTTPレスポンスヘッダを送信する
代表例Location: ヘッダでリダイレクトができる
実行結果ブラウザが指定先URLに自動遷移する
注意点出力より前にheader()を呼び出す必要あり
試験ポイントHTTPヘッダの送信タイミングとリダイレクトの仕組み

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次