在PHP 中, header()函數是用來發送原始的HTTP 頭部信息的,它通常用於重定向、設置頁面內容類型、緩存控制等操作。但是,在使用header()函數時,經常會遇到一個錯誤提示:“Headers already sent”(頭信息已經發送)。這個問題的產生原因以及解決方法,本文將詳細說明。
當你在PHP 腳本中使用header()函數時,它需要在任何輸出(如HTML 內容、空格、換行等)之前發送頭信息。如果PHP 腳本已經發送了內容(即在調用header()函數之前輸出了任何數據),就會導致這個錯誤。錯誤消息通常會提示“Headers already sent”,意思是頭信息已經被發送到瀏覽器,無法再次發送。
導致“Headers already sent” 錯誤的常見原因包括:
HTML 或空格提前輸出:
在調用header()函數之前,如果PHP 腳本中已經輸出了任何HTML 內容、空格或換行符,就會觸發這個錯誤。尤其是在PHP 標籤外部( <?php ?> )的空格或換行,很容易被忽視。
文件編碼問題:
如果PHP 文件的編碼格式是UTF-8,且文件中包含BOM(字節順序標記),那麼在文件頂部即使沒有顯示輸出內容,BOM 也會被視為輸出,導致頭信息提前發送。
輸出緩衝區問題:
在某些情況下,PHP 的輸出緩衝區設置可能不合適,導致內容提前輸出。例如,如果你沒有使用ob_start()啟動輸出緩衝區,PHP 可能會在調用header()之前發送部分輸出。
確保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>
檢查文件編碼並移除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();
?>
檢查引入的文件:
如果你使用include或require引入了其他PHP 文件,需要確保這些文件也沒有在輸出任何內容之前調用header()函數。你可以將header()調用放在所有其他PHP 代碼之前,確保沒有被輸出內容干擾。
調試工具:
使用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()函數正常工作,避免因提前發送頭信息而引起的錯誤。