PHPプログラミングでは、 Header()関数を使用して、生のHTTPヘッダー情報を送信します。一般的なアプリケーションシナリオには、ユーザーのリダイレクト、キャッシュ制御ヘッダーの設定、またはコンテンツタイプの変更が含まれます。ただし、 Header()関数の使用には重要な制限があります - Header()を呼び出す前に出力はありません。それ以外の場合、PHPはヘッダー情報を正しく送信せず、エラーが発生する可能性があります。
HTTPプロトコルの要件
HTTPプロトコルは、ヘッダー情報を応答本体の前に送信する必要があることを規定しています。したがって、 Header()関数を使用する場合、ブラウザに出力されていないことを確認する必要があります。出力(HTML、スペース、ラインブレーク、またはエラーメッセージなど)は、PHPに応答本体の一部を送信するため、その後のヘッダー情報が送信されないようにします。言い換えれば、 header()は出力の前に呼び出される必要があります。
「ヘッダー情報を変更できません」エラー<BR> Header()関数を呼び出す前に何かが出力された場合、PHPは「警告:ヘッダー情報を変更できません - 既に送信されたヘッダー...」。これは、PHPが応答コンテンツの送信を開始し、ヘッダー情報を変更または送信できなくなることを意味します。このエラーは通常、特にリダイレクトやログイン検証などのシナリオで、ウェブサイトの通常の機能を破壊します。
キャッシュコントロール
PHPがヘッダー情報を送信する場合、 Header()を使用してキャッシュ、タイプ、またはリダイレクトを制御できます。出力がある場合、HTTPヘッダーを予想どおりに設定できないため、望ましくないキャッシュやページリダイレクトが適切に実行されない可能性があります。
空白の出力がないことを確認してください<br> PHPファイルの開始時と終了時に、Whitespace文字またはラインブレークを避けてください。通常、この問題は、特に< ? PHPタグ。ファイルの開始時と最後にスペースやラインブレークがないことを確認してください。
たとえば、次のコードは問題を作成します。
<?php
// 間違い:前に空白の文字があります
header("Location: http://m66.net");
exit;
?>
正しい方法は次のとおりです。
<?php
header("Location: http://m66.net");
exit;
?>
ob_start()およびob_end_flush()を使用します
PHPは、実際の応答を送信する前にすべての出力コンテンツをキャプチャできる出力バッファリングメカニズムを提供します。 OB_START()を使用することにより、PHPはOB_END_FLUSH()が呼び出されるまで出力をバッファリングを開始します。これにより、何かを出力する前にヘッダー()関数を呼び出すことができます。
例:
<?php
ob_start(); // 出力バッファリングを開始します
header("Location: http://m66.net"); // 今では安全に使用できます header
ob_end_flush(); // バッファをクリアして出力を送信します
exit;
?>
エラーメッセージの出力を避けてください<br> 開発中、PHPは通常、エラーが発生した場合に警告またはエラーメッセージを表示します。エラーメッセージが出力されると、ヘッダーの送信に影響します。これを回避するために、 PHP.iniファイルを構成するか、 ini_set()関数を使用してエラー出力を無効にすることができます。
php.iniを構成:
display_errors = Off
コードでini_set()を使用します。
<?php
ini_set('display_errors', 0); // 禁止間違い输出
header("Location: http://m66.net");
exit;
?>
サードパーティのライブラリまたはフレームワークを確認してください<br> 一部のサードパーティライブラリまたはフレームワークは、コンテンツを自動的に出力したり、リクエスト処理中にデバッグを実行したりする場合があります。この時点で、これらのライブラリのドキュメントまたはソースコードを確認して、 Header()を呼び出す前にコンテンツを出力しないことを確認できます。一部のフレームワークを使用すると、この問題を回避するためにログレベルまたは出力レベルを構成できます。
デバッグ出力<br> 開発段階では、デバッグする必要がある場合は、出力バッファリングにOB_START()を一時的に使用するか、デバッグが完了した後にすべての出力をコメントして、出力前にヘッダー情報が送信されることを確認できます。
PHPのHeader()関数を使用する場合は、呼び出される前に出力されていないことを確認してください。スペース、ラインブレイク、HTMLコード、またはエラーメッセージなどは、PHPがヘッダー情報を正しく送信できないようにする可能性があります。出力バッファーを合理的に使用し、出力エラー情報を回避し、コード構造を慎重にスケジュールすることにより、この問題を効果的に回避し、 Header()関数が正常に機能し、それにより、正しいリダイレクト、キャッシュ制御、およびWebサイトのその他の機能を達成することを保証します。