MeWrite Docs

Warning: Cannot modify header information - headers already sent

PHPでHTTPヘッダが既に送信された後にヘッダを変更しようとした際のエラー

概要

PHPでHTTPヘッダ(header()setcookie()session_start()など)を送信しようとした際、既に何らかの出力がブラウザに送信されている場合に発生するエラーです。

エラーメッセージ

Warning: Cannot modify header information - headers already sent by (output started at /path/to/file.php:10) in /path/to/another.php on line 20

原因

  1. HTML出力後のheader(): HTMLやテキストの出力後にヘッダを送信
  2. BOM(Byte Order Mark): UTF-8 BOM付きファイル
  3. 空白や改行: <?phpの前や?>の後の空白
  4. echoやprint: ヘッダ送信前に出力
  5. エラーメッセージ: WarningやNoticeの出力

解決策

1. 出力前にヘッダを送信

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
// Good: すべての出力の前にヘッダを設定
session_start();
header('Content-Type: text/html; charset=UTF-8');

// その後にHTML出力
?>
<!DOCTYPE html>
<html>
<head>
    <title>Page</title>
</head>

2. リダイレクト時の注意

1
2
3
4
5
6
7
8
<?php
// Bad: 出力後にリダイレクト
echo "Processing...";
header('Location: /dashboard'); // Error

// Good: 出力前にリダイレクト
header('Location: /dashboard');
exit; // リダイレクト後は必ずexit

3. 出力バッファリングを使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
// スクリプトの先頭でバッファリング開始
ob_start();

// 何らかの出力
echo "Some output";

// ヘッダを設定(バッファリングされているのでOK)
header('Location: /redirect');

// バッファをフラッシュ
ob_end_flush();
1
2
// php.ini で設定
output_buffering = On

4. BOMを削除

1
2
3
4
5
6
7
# BOMを確認
file -bi file.php

# BOMを削除(Unix/Linux)
sed -i '1s/^\xEF\xBB\xBF//' file.php

# エディタで「UTF-8 without BOM」で保存

5. ファイル末尾の閉じタグを省略

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
// PHPのみのファイルでは閉じタグを省略(推奨)
// これにより ?> 後の空白問題を回避

class MyClass
{
    // ...
}

// ?> は書かない

6. 空白の確認

1
2
3
4
5
6
   <?php  // ← 先頭に空白があるとエラー
session_start();

// 正しくは
<?php
session_start();

7. インクルードファイルの確認

1
2
3
4
5
// included_file.php
<?php
// 何も出力しない
?>
 <!-- ← この空白が問題 -->
1
2
3
4
// 正しくは
<?php
// 何も出力しない
// 閉じタグなし

8. エラー表示を抑制(本番環境)

1
2
3
4
// php.ini
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log

よくある間違い

  • UTF-8 BOM付きでファイルを保存する
  • <?phpタグの前に空行を入れる
  • includeしたファイルに閉じタグと空白がある
  • var_dump()やprint_r()でデバッグ出力した後にヘッダを送信

関連エラー

参考リンク

PHP の他のエラー

最終更新: 2025-12-13