【PHP8.x】header()関数の使い方
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)
1header('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 関数でリダイレクトする
1<?php 2 3// リダイレクト先のURLを設定します。 4// 例としてGoogleのトップページを設定しています。 5$redirectUrl = 'https://www.google.com'; 6 7// HTTPヘッダーを送信して、ブラウザを別のURLへリダイレクトさせます。 8// 'Location:' ヘッダーは、ブラウザに新しいURLへ移動するよう指示します。 9// 第2引数は、同じヘッダーが既に送信されている場合に置き換えるかどうか(デフォルトはtrue)。 10// 第3引数は、HTTPレスポンスコードを指定します。 11// 302は「Found」(一時的なリダイレクト)を示し、一般的に使用されます。 12header('Location: ' . $redirectUrl, true, 302); 13 14// header関数を実行した後、スクリプトの実行を必ず終了させる必要があります。 15// これがないと、リダイレクトが行われる前にスクリプトの残りの部分が処理されてしまい、 16// 意図しない出力や動作が発生する可能性があります。 17exit();
PHPのheader関数は、ウェブブラウザとサーバー間でやり取りされるHTTPヘッダー情報を送信するために使用されます。特にウェブページのリダイレクトにおいて重要な役割を果たします。
サンプルコードでは、header関数を使ってブラウザをhttps://www.google.comへリダイレクトする例を示しています。第一引数$headerには、'Location: 'に続けてリダイレクト先のURLを指定します。これにより、ブラウザは指定された新しいURLへ移動するよう指示されます。
第二引数$replaceはブール値で、同じヘッダーが既に送信されている場合に、そのヘッダーを置き換えるかどうかを決定します(デフォルトはtrue)。リダイレクトのシナリオでは通常trueのままで問題ありません。第三引数$response_codeには、HTTPレスポンスコードを指定します。例えば302は「Found」(一時的なリダイレクト)を意味し、広く利用されます。
header関数はvoid型を返すため、直接戻り値として処理の成否を受け取ることはできません。
この関数を実行してリダイレクトを指示した後には、必ずexit()関数を呼び出してスクリプトの実行を終了させる必要があります。これにより、リダイレクトが行われる前にスクリプトの残りの部分が処理されてしまうことを防ぎ、意図しない出力や動作を防ぎ、確実なリダイレクトを実現します。
PHPのheader関数でリダイレクトを行う際は、まずHTMLなどのコンテンツを出力する前に呼び出す必要があります。出力後に実行するとエラーとなりますのでご注意ください。
また、header関数でリダイレクトヘッダーを送信した後は、必ずexit()やdie()関数を使用してスクリプトの実行を終了させてください。これは、リダイレクトが完了する前に後続のコードが実行され、意図しない情報が出力されたり、セキュリティ上の脆弱性が生じたりするのを防ぐため非常に重要です。
リダイレクトの種類を示すHTTPステータスコード(例: 302 Found)も適切に指定し、ブラウザに新しいURLへ移動するよう明確に指示することが大切です。
PHP header()でURLリダイレクトする
1<?php 2 3/** 4 * 指定されたURLへユーザーをリダイレクトします。 5 * header()関数は、HTTPヘッダーを送信するために使用され、 6 * "Location:"ヘッダーはブラウザに別のURLへ移動するよう指示します。 7 * 8 * 重要: header()関数は、HTML出力やecho()などによるコンテンツが 9 * ブラウザに送信される前に呼び出す必要があります。 10 * 11 * @param string $url リダイレクト先のURL。例: '/dashboard.php', 'https://example.com' 12 * @return void 13 */ 14function redirectToUrl(string $url): void 15{ 16 // 'Location:'ヘッダーを送信し、リダイレクト先を指定します。 17 // デフォルトのHTTPステータスコードは302 Foundが送信されます。 18 header("Location: " . $url); 19 20 // header()関数を呼び出した後は、必ずexit()またはdie()を呼び出して 21 // スクリプトの実行を停止してください。 22 // これにより、リダイレクトが完了する前に意図しないコンテンツが 23 // クライアントに送信されるのを防ぎます。 24 exit(); 25} 26 27// === サンプルコードの使用例 === 28 29// 仮のユーザー認証状態をシミュレート 30$isUserAuthenticated = false; // 実際にはセッションやデータベースから取得します 31 32if (!$isUserAuthenticated) { 33 // ユーザーが認証されていない場合、ログインページにリダイレクトします。 34 redirectToUrl('/login.php'); 35} else { 36 // ユーザーが認証されている場合、通常のコンテンツを表示します。 37 echo "<h1>ダッシュボードへようこそ!</h1>"; 38 echo "<p>認証済みのユーザーのみが閲覧できるコンテンツです。</p>"; 39} 40 41// redirectToUrl()が実行された場合、この後のコードは実行されません。 42echo "<p>このメッセージは、リダイレクトが成功した場合は表示されません。</p>"; 43 44?>
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関数で相対パスリダイレクトする
1<?php 2 3/** 4 * このスクリプトは、PHPのheader関数を使用して、相対パスでのリダイレクトを実演します。 5 * 6 * リダイレクトをテストするには、このスクリプトを実行するURLに "?redirect=true" を追加してアクセスしてください。 7 * 例: http://localhost/your_script_name.php?redirect=true 8 * 9 * このスクリプトと同じディレクトリに 'target_page.php' という名前のファイルが存在することを想定しています。 10 * 'target_page.php' の内容は、リダイレクトが成功したことを示す簡単なHTMLで十分です。 11 * 例: <?php // target_page.php の内容 12 * echo "<h1>リダイレクト成功!</h1><p>相対パスでこのページに到達しました。</p>"; 13 * ?> 14 */ 15 16// header関数は、いかなる出力(HTMLタグ、空白文字、echo/printによる出力など)よりも前に呼び出す必要があります。 17// 出力後に呼び出すと「Cannot modify header information - headers already sent by...」のようなエラーが発生します。 18 19if (isset($_GET['redirect']) && $_GET['redirect'] === 'true') { 20 // リダイレクト先の相対パスを指定します。 21 // この例では、現在のスクリプトと同じディレクトリにある 'target_page.php' へリダイレクトします。 22 // 他の例: 親ディレクトリへは '../parent_page.php'、サブディレクトリへは 'sub_dir/another_page.php' のように指定できます。 23 $relativePath = 'target_page.php'; 24 25 // 'Location' ヘッダーを設定し、ブラウザに新しいURLへリクエストを送るよう指示します。 26 // 第二引数 'true' は、既存の同じ種類のヘッダーを置換することを意味します (Locationヘッダーの場合、通常はtrue)。 27 // 第三引数 '302' は、一時的なリダイレクト(HTTPステータスコード: Found)を示します。 28 // 恒久的なリダイレクトの場合は '301' (Moved Permanently) を使用します。 29 header('Location: ' . $relativePath, true, 302); 30 31 // header関数でリダイレクトを指示した後、必ずスクリプトの実行を停止してください。 32 // これにより、リダイレクトが行われる前に、意図しないコンテンツがクライアントに送信されるのを防ぎます。 33 exit(); 34} 35 36// リダイレクト条件が満たされない場合(例: 初回アクセス時やURLに ?redirect=true がない場合) 37// 以下のメッセージが表示され、リダイレクトは行われません。 38echo "<h1>メインページ</h1>"; 39echo "<p>リダイレクトは行われませんでした。</p>"; 40echo "<p>リダイレクトをテストするには、URLに <a href=\"?redirect=true\">?redirect=true</a> を追加してアクセスしてください。</p>"; 41echo "<p>このスクリプトと同じディレクトリに <code>target_page.php</code> が存在する必要があります。</p>"; 42 43?>
このサンプルコードは、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を用いるなど、リダイレクトの目的を明確に示すために重要です。相対パスは現在のスクリプトファイルからの位置関係で指定されるため、正しいリダイレクト先を確実に指定してください。
headers_sent() でHTTPヘッダー送信状態を確認する
1<?php 2 3/** 4 * このスクリプトは、HTTPヘッダーが既に送信されている場合に 5 * header() 関数がどのように動作するかを示します。 6 * headers_sent() 関数を使用して、ヘッダー送信状態を確認します。 7 */ 8 9// 意図的に何らかの出力を発生させます。 10// PHPでは、HTMLタグやecho文などがブラウザに出力されると、 11// その前にHTTPヘッダーが自動的に送信されます。 12echo "<h1>HTTPヘッダー送信の確認</h1>"; 13echo "<p>この行が出力された時点で、PHPはHTTPヘッダーをブラウザに送信しています。</p>"; 14 15// headers_sent() 関数で、HTTPヘッダーが既に送信済みかチェックします。 16if (headers_sent()) { 17 // ヘッダーが送信済みの場合、header() 関数は新たなヘッダーを設定できません。 18 // PHPは通常Warningを発しますが、スクリプトの実行は停止しません。 19 echo "<p style='color: red;'><strong>警告:</strong> HTTPヘッダーは既に送信されています。<br>"; 20 echo "このため、これ以降に呼び出される header() 関数は効果を持ちません。</p>"; 21 22 // 例として、リダイレクトのヘッダーを設定しようとします。 23 // この呼び出しは実際にはブラウザをリダイレクトしません。 24 header('Location: /some-target-page.php'); 25 26 echo "<p>header('Location: /some-target-page.php') を試みましたが、ヘッダーが送信済みのため無視されました。</p>"; 27 echo "<p>このような状況では、JavaScriptによるリダイレクトなど、代替手段を検討する必要があります。</p>"; 28 29 // JavaScriptでのリダイレクトの例(コメントアウト) 30 // echo '<script>window.location.href = "/some-target-page.php";</script>'; 31 32} else { 33 // このブロックは、上記で何も出力されていなければ実行されます。 34 // ヘッダーがまだ送信されていない場合、header() 関数は正常に動作します。 35 header('Content-Type: text/html; charset=utf-8'); 36 echo "<p>HTTPヘッダーはまだ送信されていませんでした。<br>Content-Typeヘッダーが正常に設定されました。</p>"; 37} 38 39echo "<p>スクリプトの実行が終了しました。</p>";
PHPのheader関数は、ウェブブラウザに送信されるHTTPヘッダーを設定するために使用されます。例えば、ページのコンテンツタイプを指定したり、別のURLへリダイレクトを指示したりする際に利用します。引数$headerで設定するヘッダー文字列を指定し、$replaceで既存の同名ヘッダーを置換するかどうかを、$response_codeでHTTPレスポンスコードを指定できます。この関数は戻り値を持ちません。
一方、headers_sent関数は、既にHTTPヘッダーがブラウザに送信されているかどうかを確認します。この関数は、ヘッダーが送信済みであればtrue、まだ送信されていなければfalseを返します。
サンプルコードは、この2つの関数の挙動を具体的に示しています。PHPでは、echo文などで何らかのコンテンツがブラウザに送られると、その前にHTTPヘッダーが自動的に送信されます。サンプルでは、最初にechoで出力を行った後、headers_sent()でヘッダーが既に送信済みであると判断します。この状態でheader()関数を呼び出しても、新たなヘッダー(例えばリダイレクト)は設定できません。これは、HTTPの仕様上、ヘッダーは一度送信されると変更できないためです。したがって、header()関数を使用してヘッダーを操作したい場合は、必ず何らかの出力が行われる前に実行する必要があります。
PHPのheader()関数は、ブラウザへHTMLなどの内容を送信する前に呼び出す必要があります。一度でも出力があるとHTTPヘッダーは自動的に送信され、それ以降のheader()呼び出しは効果を失います。headers_sent()関数でヘッダーが既に送信済みか確認し、無効なheader()呼び出しは避けてください。ヘッダー送信後にheader()を呼び出すと警告が出て機能しません。この場合、JavaScriptによるリダイレクトなどクライアントサイドの代替手段を検討してください。予期せぬヘッダー送信を防ぐため、スクリプトの最初にob_start()関数で出力バッファリングを開始することが一般的なベストプラクティスです。