はじめに
PHPのheader()関数は、HTTPレスポンスヘッダを直接送信できる便利な関数です。
特に「Locationヘッダ」は、ブラウザに別のURLへ移動させる“リダイレクト”の仕組みを担っています。
この記事では、header('Location: ...) がどのように動作するのか、そして出力順序の注意点を含めて整理します。
目次
■ 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ヘッダ送信前」にしか呼び出せません。もし、echoやvar_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ヘッダの送信タイミングとリダイレクトの仕組み |
