PHPでは、 Header()関数を使用して、生のHTTPヘッダー情報を送信します。通常、リダイレクト、ページコンテンツのタイプ、キャッシュ制御、その他の操作の設定に使用されます。ただし、 header()関数を使用する場合、エラーメッセージが発生することがよくあります。「既に送信されているヘッダー」です。この記事では、この問題の原因と解決策を詳細に説明します。
PHPスクリプトでHeader()関数を使用する場合、出力(HTMLコンテンツ、スペース、ラインブレークなど)の前にヘッダー情報を送信する必要があります。このエラーは、PHPスクリプトがコンテンツを送信した場合に生成されます(つまり、 Header()関数を呼び出す前にデータは出力されます)。エラーメッセージは通常、「既に送信されたヘッダー」をプロンプトします。つまり、ヘッダーメッセージがブラウザに送信され、再び送信できません。
「すでに送信されたヘッダー」エラーの一般的な原因は次のとおりです。
HTMLまたはスペースは事前に出力されます:
HTMLコンテンツ、スペース、またはニューラインがHeader()関数を呼び出す前にPHPスクリプトに出力された場合、このエラーはトリガーされます。特に、PHPタグ外のスペースまたはニューライン( <?php?> )は簡単に見落とされます。
ファイルエンコードの問題:
PHPファイルのエンコード形式がUTF-8であり、ファイルにBOM(バイトオーダーマーク)が含まれている場合、出力コンテンツがファイルの上部に表示されない場合でも、BOMは出力と見なされ、ヘッダー情報が事前に送信されます。
出力バッファの問題:
場合によっては、PHPの出力バッファー設定が不適切である可能性があり、その結果、コンテンツが事前に出力されます。たとえば、 OB_START()で出力バッファーを起動しない場合、PHPはHeader()を呼び出す前に出力の一部を送信する場合があります。
Header()呼び出しの前に出力がないことを確認してください。
HTML出力またはWhitespace文字がないことを確認するには、Header()呼び出しの前にコードを確認する必要があります。スペースや新しいラインでさえ、このエラーをスローします。最善のことは、PHPスクリプトの上部にHeader()関数を配置して、出力がないことを確認することです。
エラー例:
<html>
<body>
<?php
header("Location: https://m66.net/somepage.php"); // この禁止はエラーを報告します
?>
</body>
</html>
正しい例:
<?php
header("Location: https://m66.net/somepage.php"); // 正しく使用してください
exit();
?>
<html>
<body>
</body>
</html>
ファイルのエンコーディングを確認し、BOMを削除します。
ファイルがUTF-8エンコードされており、BOMが含まれている場合、テキストエディター(Sublime Text、NotePad ++など)を介してファイルを再配置し、それなしでBOM形式を選択できます。さらに、 file_get_contents()またはfopen()を使用してファイルを読み取る場合、BOMが含まれていないことを確認する必要があります。
出力バッファを有効にします:
PHPスクリプトの開始時に出力バッファーを有効にし、 OB_START()を介してバッファを起動して、出力がある場合でも、手動でOB_END_FLUSH()を呼び出すか、スクリプトが終了するまでバッファーに一時的に保存できます。
例:
<?php
ob_start(); // 出力バッファリングを開始します
header("Location: https://m66.net/somepage.php"); // この行はエラーを報告しません
ob_end_flush(); // 出力バッファコンテンツ
exit();
?>
インポートされたファイルを確認してください:
他のPHPファイルを導入するために含める、または必要とする場合、これらのファイルが何かを出力する前にheader()関数を呼び出さないことを確認する必要があります。他のすべてのPHPコードの前にHeader()コールを配置して、出力コンテンツによって妨害されないことを確認できます。
デバッグツール:
headers_sent()関数を使用すると、問題の診断に役立ちます。この関数は、ヘッダーメッセージがどこでいつ送信されたかを示します。それを使用して、エラーがどこにあるかを見つけることができます。
例: