【PHP8.x】header関数の使い方

作成日: 更新日:

header関数は、ウェブサーバーからクライアント(通常はウェブブラウザ)へHTTPヘッダー情報を送信する関数です。HTTPヘッダーとは、ウェブサーバーとブラウザがウェブページをやり取りする際に、ページのコンテンツタイプ、キャッシュ設定、別のページへの移動(リダイレクト)といった重要なメタデータや指示を伝えるための情報のことです。

この関数を使用することで、開発者はHTTPリクエストに対するサーバーの応答を細かく制御できるようになります。例えば、header('Location: https://example.com/new-page.php');のように記述することで、ユーザーを別のページへ自動的に転送(リダイレクト)させることができます。また、header('Content-Type: application/json');と指定すれば、ブラウザに送信するデータがJSON形式であることを伝え、適切に処理させることが可能です。

さらに、header('HTTP/1.0 404 Not Found');のようにHTTPステータスコードを明示的に設定することもできます。

重要な注意点として、header関数が呼び出される前に、PHPスクリプトから何らかの出力(例えば、HTMLタグや空白文字、改行コードなど)が行われてしまうと、既にヘッダーが送信済みとなり、エラーが発生します。そのため、この関数はPHPスクリプトの実行の非常に早い段階で呼び出す必要があります。

関数の引数には、送信したいヘッダー文字列の他に、同じ種類のヘッダーが既に存在する場合にそれを置き換えるかどうかを指定するブール値のreplace引数や、HTTPレスポンスコードを直接指定する整数値のresponse_code引数があります。これらを活用することで、より柔軟なHTTPヘッダー管理が可能です。

基本的な使い方

構文(syntax)

header('Location: /dashboard.php');

引数(parameters)

string $header, bool $replace = true, int $response_code = 0

  • string $header: 送信するHTTPヘッダーを指定する文字列
  • bool $replace = true: 同名のヘッダーを置き換えるかどうかを指定します。trueで置き換え、falseで追加します
  • int $response_code = 0: HTTPレスポンスコードを指定します。0を指定すると、PHPが自動的に判断します

戻り値(return)

void

HTTPヘッダーを送信します。この関数は直接的な戻り値を返しません。

サンプルコード

PHP header()でURLリダイレクトする

<?php

/**
 * 指定されたURLへユーザーをリダイレクトします。
 * header()関数は、HTTPヘッダーを送信するために使用され、
 * "Location:"ヘッダーはブラウザに別のURLへ移動するよう指示します。
 *
 * 重要: header()関数は、HTML出力やecho()などによるコンテンツが
 * ブラウザに送信される前に呼び出す必要があります。
 *
 * @param string $url リダイレクト先のURL。例: '/dashboard.php', 'https://example.com'
 * @return void
 */
function redirectToUrl(string $url): void
{
    // 'Location:'ヘッダーを送信し、リダイレクト先を指定します。
    // デフォルトのHTTPステータスコードは302 Foundが送信されます。
    header("Location: " . $url);

    // header()関数を呼び出した後は、必ずexit()またはdie()を呼び出して
    // スクリプトの実行を停止してください。
    // これにより、リダイレクトが完了する前に意図しないコンテンツが
    // クライアントに送信されるのを防ぎます。
    exit();
}

// === サンプルコードの使用例 ===

// 仮のユーザー認証状態をシミュレート
$isUserAuthenticated = false; // 実際にはセッションやデータベースから取得します

if (!$isUserAuthenticated) {
    // ユーザーが認証されていない場合、ログインページにリダイレクトします。
    redirectToUrl('/login.php');
} else {
    // ユーザーが認証されている場合、通常のコンテンツを表示します。
    echo "<h1>ダッシュボードへようこそ!</h1>";
    echo "<p>認証済みのユーザーのみが閲覧できるコンテンツです。</p>";
}

// redirectToUrl()が実行された場合、この後のコードは実行されません。
echo "<p>このメッセージは、リダイレクトが成功した場合は表示されません。</p>";

?>

PHPのheader()関数は、HTTPヘッダーをクライアント(ブラウザなど)に送信するために使用されます。特に、Webアプリケーションでユーザーを別のURLへ転送する「リダイレクト」処理によく利用されます。

引数$headerには、送信したいHTTPヘッダーの文字列を指定します。例えば、"Location: /login.php"のように指定することで、ブラウザに/login.phpへ移動するよう指示します。この際、HTTPステータスコードはデフォルトで「302 Found」が送信されますが、必要に応じて第二引数$replaceや第三引数$response_codeを使用して詳細な制御も可能です。戻り値はvoidであり、この関数自体は何も値を返しません。

この関数を使う上で非常に重要な点は二つあります。一つ目は、header()関数はHTML出力やecho()など、コンテンツがブラウザに送信される「前」に呼び出す必要があることです。二つ目は、リダイレクト処理を行う場合は、header()関数を呼び出した直後に必ずexit()またはdie()を使用してスクリプトの実行を停止することです。これにより、リダイレクトが完了する前に意図しないコンテンツがクライアントに送信されるのを防ぎ、安全なリダイレクトを実現します。

サンプルコードでは、認証されていないユーザーをログインページへリダイレクトする具体的な利用例を示しており、Webアプリケーションにおけるユーザー管理やセキュリティ対策の一環として頻繁に活用されます。

header()関数は、HTMLタグやechoによる出力、あるいはPHP開始タグ(<?php)の前の空白文字や改行など、いかなる内容がブラウザに送信されるよりも前に呼び出す必要があります。

特に"Location:"ヘッダーを用いてリダイレクトを行う際は、header()関数を呼び出した後、必ずexit()またはdie()を呼び出してスクリプトの実行を停止してください。これにより、リダイレクトが完了する前に意図しないコンテンツがクライアントに送信されるのを防ぎ、セキュリティ上のリスクを低減できます。

リダイレクト先のURLをユーザーからの入力に基づいて生成する場合は、オープンリダイレクトなどの脆弱性を避けるため、URLの安全性を十分に検証する必要があります。

PHP header関数で相対パスリダイレクトする

<?php

/**
 * このスクリプトは、PHPのheader関数を使用して、相対パスでのリダイレクトを実演します。
 *
 * リダイレクトをテストするには、このスクリプトを実行するURLに "?redirect=true" を追加してアクセスしてください。
 * 例: http://localhost/your_script_name.php?redirect=true
 *
 * このスクリプトと同じディレクトリに 'target_page.php' という名前のファイルが存在することを想定しています。
 * 'target_page.php' の内容は、リダイレクトが成功したことを示す簡単なHTMLで十分です。
 * 例: <?php // target_page.php の内容
 *     echo "<h1>リダイレクト成功!</h1><p>相対パスでこのページに到達しました。</p>";
 *     ?>
 */

// header関数は、いかなる出力(HTMLタグ、空白文字、echo/printによる出力など)よりも前に呼び出す必要があります。
// 出力後に呼び出すと「Cannot modify header information - headers already sent by...」のようなエラーが発生します。

if (isset($_GET['redirect']) && $_GET['redirect'] === 'true') {
    // リダイレクト先の相対パスを指定します。
    // この例では、現在のスクリプトと同じディレクトリにある 'target_page.php' へリダイレクトします。
    // 他の例: 親ディレクトリへは '../parent_page.php'、サブディレクトリへは 'sub_dir/another_page.php' のように指定できます。
    $relativePath = 'target_page.php';

    // 'Location' ヘッダーを設定し、ブラウザに新しいURLへリクエストを送るよう指示します。
    // 第二引数 'true' は、既存の同じ種類のヘッダーを置換することを意味します (Locationヘッダーの場合、通常はtrue)。
    // 第三引数 '302' は、一時的なリダイレクト(HTTPステータスコード: Found)を示します。
    // 恒久的なリダイレクトの場合は '301' (Moved Permanently) を使用します。
    header('Location: ' . $relativePath, true, 302);

    // header関数でリダイレクトを指示した後、必ずスクリプトの実行を停止してください。
    // これにより、リダイレクトが行われる前に、意図しないコンテンツがクライアントに送信されるのを防ぎます。
    exit();
}

// リダイレクト条件が満たされない場合(例: 初回アクセス時やURLに ?redirect=true がない場合)
// 以下のメッセージが表示され、リダイレクトは行われません。
echo "<h1>メインページ</h1>";
echo "<p>リダイレクトは行われませんでした。</p>";
echo "<p>リダイレクトをテストするには、URLに <a href=\"?redirect=true\">?redirect=true</a> を追加してアクセスしてください。</p>";
echo "<p>このスクリプトと同じディレクトリに <code>target_page.php</code> が存在する必要があります。</p>";

?>

このサンプルコードは、PHPのheader関数を使用して、ブラウザを別のページへリダイレクトする方法を示しています。header関数は、HTTPヘッダーと呼ばれる、ブラウザへの指示情報を送信するための関数です。

コードでは、Locationヘッダーを用いてリダイレクト先を指定しています。ここでは 'target_page.php' という相対パスが指定されており、これはスクリプトが実行されているファイルと同じディレクトリにあるページへ移動するよう指示しています。

header関数の第一引数には、'Location: 'に続けてリダイレクト先のパスを文字列として渡します。第二引数のtrueは、同じ種類のヘッダーが存在した場合に上書きすることを示します。第三引数にはHTTPステータスコードを指定でき、この例の302は「一時的なリダイレクト」を意味します。この関数は値を返さないため、戻り値はvoidです。

header関数を使用する際には、HTMLタグやPHPのechoによる出力、さらにはファイルの先頭にある空白など、いかなる情報もブラウザに送信される前に呼び出す必要があります。また、リダイレクトを指示した後は、予期せぬ処理が実行されるのを防ぐためにexit()でスクリプトを即座に終了させることが推奨されます。

header関数は、HTMLタグや空白文字、echoなどの出力よりも前に必ず呼び出してください。何らかの出力があった後に呼び出すとエラーが発生します。リダイレクトを指示するLocationヘッダーを設定した後は、必ずexit()関数でスクリプトの実行を停止してください。これは、リダイレクトが行われる前に意図しないコンテンツがクライアントに送信されるのを防ぐためです。第三引数で指定するHTTPステータスコードは、一時的なリダイレクトには302、恒久的なリダイレクトには301を用いるなど、リダイレクトの目的を明確に示すために重要です。相対パスは現在のスクリプトファイルからの位置関係で指定されるため、正しいリダイレクト先を確実に指定してください。

【PHP8.x】header関数の使い方 | いっしー@Webエンジニア