PHPのheaders already sent対処法

冒頭まとめ PHPでリダイレクトやクッキーの設定をするとき、次の警告が出ることがあります。 PHP Warning: Cannot modify header information - headers already sent by (output started at /var/www/app/config.php:12) in /var/www/app/login.php on line 30 HTTPヘッダーを既に送ったため、それ以降の変更ができなかったことを示します。ヘッダーは、転送先やクッキーなどを本文とは別に伝える情報です。 まず output started at の場所を確認し、意図しない出力を取り除くか、ヘッダーを設定する処理を出力より前に移します。警告を隠すだけでは、送れなかったリダイレクトやクッキーは直りません。 警告にある2つのファイル位置を読み分ける 例の config.php:12 は、PHPが出力開始位置として記録した場所です。後ろの login.php on line 30 は、既にヘッダーが送られた後で変更を試みた場所です。 PHP 8.5.12の実装では、送信済みのヘッダーを変更しようとすると、記録されている出力開始位置を警告に含めて失敗します。位置が取れない場合は、括弧内の情報がない短い文言になります。 そのため、headerを書いた行だけでなく、先に読み込んだ設定ファイルや表示用ファイルも確認対象です。ただし、先の出力が正しいHTMLなら、それを削除するのではなく、出力前に転送の要否を決めるよう処理順を直します。 これはWarningです。標準の動作では警告の後も処理が続くため、リダイレクトが失敗したまま後続のHTMLや処理が実行されることがあります。独自のエラー処理を使うアプリでは、警告の扱いも確認してください。 echo以外の空白や読み込み先も確認する header()の公式説明は、ヘッダーを実際の出力より前に呼ぶ必要があると説明しています。出力には echo や print だけでなく、PHPタグの外のHTMLも含まれます。 include や require の読み込み先も確認します。自分のファイルにechoが無くても、読み込み先がHTMLや空白を出していれば、先に出力が進んでいる場合があります。 PHPだけを書く設定ファイルや関数定義のファイルでは、次のように開始タグから書き、末尾の閉じタグを省きます。 <?php // config.php $config = [ 'app_name' => 'Example', ]; PHPタグの公式説明も、末尾がPHPコードなら閉じタグを省く方法を勧めています。閉じタグの後ろへ、意図せず空白などが追加されるのを防ぐためです。 先に別の警告が画面へ表示されていないかも、ログをさかのぼって確認してください。診断のための var_dump() などを追加する場合も、その出力がヘッダー設定より先にならないようにします。 リダイレクトやクッキーの設定を表示より前に置く HTMLを出してから転送先を決める構成なら、転送の判断を先に行います。次は出力とヘッダー設定の順序を示す最小例です。 <?php // HTMLを出す前に実行する header('Location: /mypage.php'); exit; 公式のリダイレクト例も、Locationを指定した後にexitを置いています。headerで転送先を指定しても、その場でPHPの残りの処理が自動的に終了するわけではありません。exitは後続の処理を止めるためのものです。 ...

2026年10月24日 · ErrorLog