ブラウザがWebページにアクセスすると、サーバーは最初にHTTPプロトコルを介してブラウザとの通信を確立します。このプロセスには、HTTPヘッダー情報とその後のHTMLコンテンツの送信が含まれます。 HTTPヘッダー情報には、Webページの基本情報(コンテンツタイプ、文字セットなど)だけでなく、ブラウザがページ表示、キャッシュ、ジャンプ、その他の動作を処理する方法も決定します。
PHPでは、 Header()関数を使用してHTTPヘッダーを送信します。たとえば、次のコードでは、ブラウザを新しいページにリダイレクトします。
<?php
header("Location: http://m66.net/newpage.php");
exit;
?>
このコードが実行されると、サーバーはリダイレクトヘッダー(場所)を送信し、ブラウザはこのヘッダー情報に基づいてジャンプします。この時点で、PHPスクリプトは( exit()により)実行を停止するため、その後のHTMLコンテンツは出力されません。
PHPでは、HTML出力の前にHTTPヘッダーを送信する必要があります。これは、HTTPヘッダー情報が最初にサーバーによって送信され、HTMLコンテンツが後続のデータであるためです。最初にHTMLコンテンツまたはPHPのその他の文字を出力し、次にHeader()関数を呼び出すと、PHPがエラーを報告し、「既に送信されたヘッダー」をプロンプトします。
たとえば、次のコードはエラーになります。
<?php
echo "Hello World!"; // 出力 HTML コンテンツ
header("Location: http://m66.net/newpage.php"); // リダイレクトヘッダーを送信してみてください
exit;
?>
このコードが実行されると、警告が投げられ、ヘッダーが送信されたことを促します。その理由は、 EchoステートメントがHTMLコンテンツを出力し、HTTPヘッダーが送信されなくなったためです。
HTTPプロトコルでは、実際のページコンテンツ(HTML、写真、CSSなど)の前にヘッダー情報を送信する必要があります。ブラウザは、受信したヘッダー情報に基づいて受信したページを処理する方法を決定します。たとえば、ロケーションヘッダーはブラウザがリダイレクトすることを示し、コンテンツタイプはブラウザに現在のページのコンテンツタイプを指示します。
HTMLコンテンツを出力する前に、PHPはこれらのヘッダーをHTMLコンテンツを出力する前に送信する必要があります。これは、HTMLがブラウザに送信され始めると、サーバーがHTTPヘッダーを変更できなくなるためです。 HTTPヘッダーを正常に変更できるようにするには(リダイレクトなど)、出力の前にHeader()が呼び出されることを確認する必要があります。
PHPでは、HTMLコンテンツを出力する前にheader()を呼び出す必要がありますが、場合によっては、出力バッファリングはこの問題を解決するのに役立ちます。出力バッファリングにより、PHPは実際に送信する前にHTMLコンテンツをメモリに保存できるようにするため、後続のHeader()を呼び出すときに出力コンテンツの影響を受けることができます。
出力バッファリングを使用したコードの例は次のとおりです。
<?php
ob_start(); // 出力バッファリングをオンにします
echo "Hello World!"; // 仍然可以输出コンテンツ
header("Location: http://m66.net/newpage.php"); // ヘッダーを送信します
exit;
?>
上記のコードでは、 OB_START()関数は出力バッファリングを有効にするため、 ECHO後にコンテンツが出力された場合でも、PHPはすぐにコンテンツをブラウザに送信しませんが、それらをバッファーに保存します。これにより、その後、 Header()関数を呼び出して、「既に送信されたヘッダー」エラーに遭遇することなくHTTPヘッダーを変更できます。
ページリダイレクト:ヘッダー( "場所:url")を使用して、ユーザーを別のページにリダイレクトします。
header("Location: http://m66.net/anotherpage.php");
exit;
コンテンツタイプの設定:ヘッダー( "Content-Type:Type")を使用して、ページのコンテンツタイプを設定します。
header("Content-Type: application/json");
echo json_encode($data);
制御キャッシュ: Header()を使用してキャッシュコントロールを設定して、ブラウザが特定のページをキャッシュするかどうかを示します。
header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");
PHPのHeader()関数はHTTPヘッダー情報を送信するために使用され、その呼び出し順序はページの出力順序にとって重要です。 HTTPヘッダーはHTMLコンテンツの前に送信する必要があるため、 Header()を呼び出すときに出力がないことを確認する必要があります。この問題を解決するために、出力バッファリングを効果的なソリューションとして使用できます。 Header()関数とページの出力順序との関係を理解すると、誤ったコールオーダーによって引き起こされるエラーと予期しない動作を回避できます。
Header()関数と出力バッファリングを合理的に使用することにより、PHPスクリプトが期待どおりに機能することを確認し、不必要なエラーを回避できます。