當前位置: 首頁> 最新文章列表> 為什麼header() 報錯“Headers already sent”?原因與解決方案

為什麼header() 報錯“Headers already sent”?原因與解決方案

M66 2025-06-05

在PHP 中, header()函數是用來發送原始的HTTP 頭部信息的,它通常用於重定向、設置頁面內容類型、緩存控制等操作。但是,在使用header()函數時,經常會遇到一個錯誤提示:“Headers already sent”(頭信息已經發送)。這個問題的產生原因以及解決方法,本文將詳細說明。

什麼是“Headers already sent” 錯誤?

當你在PHP 腳本中使用header()函數時,它需要在任何輸出(如HTML 內容、空格、換行等)之前發送頭信息。如果PHP 腳本已經發送了內容(即在調用header()函數之前輸出了任何數據),就會導致這個錯誤。錯誤消息通常會提示“Headers already sent”,意思是頭信息已經被發送到瀏覽器,無法再次發送。

為什麼會出現這個錯誤?

導致“Headers already sent” 錯誤的常見原因包括:

  1. HTML 或空格提前輸出
    在調用header()函數之前,如果PHP 腳本中已經輸出了任何HTML 內容、空格或換行符,就會觸發這個錯誤。尤其是在PHP 標籤外部( <?php ?> )的空格或換行,很容易被忽視。

  2. 文件編碼問題
    如果PHP 文件的編碼格式是UTF-8,且文件中包含BOM(字節順序標記),那麼在文件頂部即使沒有顯示輸出內容,BOM 也會被視為輸出,導致頭信息提前發送。

  3. 輸出緩衝區問題
    在某些情況下,PHP 的輸出緩衝區設置可能不合適,導致內容提前輸出。例如,如果你沒有使用ob_start()啟動輸出緩衝區,PHP 可能會在調用header()之前發送部分輸出。

如何解決“Headers already sent” 錯誤?

  1. 確保header()調用之前沒有輸出
    你需要檢查header()調用之前的代碼,確保沒有HTML 輸出或空白字符。即使是一個空格或換行也會引發此錯誤。最好的做法是將header()函數放在PHP 腳本的最頂部,確保沒有任何輸出。

    錯誤示例

     <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>
    
  2. 檢查文件編碼並移除BOM
    如果你的文件是UTF-8 編碼且包含BOM,可以通過文本編輯器(如Sublime Text、Notepad++)重新保存文件並選擇無BOM 格式。另外,使用file_get_contents()fopen()讀取文件時,也應確保沒有包含BOM。

  3. 啟用輸出緩衝區
    你可以在PHP 腳本的開頭啟用輸出緩衝區,通過ob_start()啟動緩衝區,這樣即使有輸出,也可以暫時存儲在緩衝區,直到你手動調用ob_end_flush()或腳本結束時再輸出。

    示例

     <?php
    ob_start();  // 啟動輸出緩衝
    header("Location: https://m66.net/somepage.php");  // 這行不會報錯
    ob_end_flush();  // 輸出緩衝區內容
    exit();
    ?>
    
  4. 檢查引入的文件
    如果你使用includerequire引入了其他PHP 文件,需要確保這些文件也沒有在輸出任何內容之前調用header()函數。你可以將header()調用放在所有其他PHP 代碼之前,確保沒有被輸出內容干擾。

  5. 調試工具
    使用headers_sent()函數可以幫助你診斷問題。這個函數會告訴你在什麼地方以及什麼時間已經發送了頭信息。你可以利用它來找出錯誤的具體位置。

    示例

     <?php
    if (headers_sent($file, $line)) {
        echo "Headers already sent in {$file} on line {$line}.";
    } else {
        header("Location: https://m66.net/somepage.php");
    }
    ?>
    

總結

“Headers already sent” 錯誤常常是由於在調用header()函數之前輸出了內容或文件編碼問題導致的。為避免這個問題,確保PHP 腳本的頂部沒有任何HTML 輸出、空白字符或BOM,適時使用輸出緩衝區,並且合理調試代碼。這樣可以確保header()函數正常工作,避免因提前發送頭信息而引起的錯誤。