在PHP 中, header()函數用於發送原始的HTTP 頭部信息,比如重定向、設置cookie、修改內容類型等。然而,HTTP 頭部信息必須在任何實際輸出(如HTML、echo、print 等)之前發送,否則會引發錯誤。這是因為一旦輸出開始,PHP 會自動發送HTTP 頭部。
為了避免調用header()時出錯,我們可以使用headers_sent()函數來檢測頭部是否已經發送。
headers_sent()是PHP 提供的一個內置函數,用來檢查是否有HTTP 頭部信息已經發送到瀏覽器。它的基本用法如下:
if (!headers_sent()) {
header('Location: https://m66.net/some-page');
exit;
}
如果頭部還沒有發送, headers_sent()返回false ,表示可以安全地調用header() ;如果返回true ,說明頭部已經發送,再調用header()就會報錯。
headers_sent()還可以接受兩個參數,用來獲取頭部輸出的位置(文件和行號):
if (headers_sent($file, $line)) {
echo "HTTP 頭部已在 $file 文件的第 $line 行發送。";
} else {
header('Location: https://m66.net/some-other-page');
exit;
}
這種方式特別適合調試,幫助你找到提前輸出的代碼位置。
在進行重定向之前,你應該確保沒有任何輸出:
if (!headers_sent()) {
header('Location: https://m66.net/login');
exit;
} else {
echo "無法重定向,因為已經有輸出。";
}
同樣, setcookie()依賴HTTP 頭部,因此也要檢查:
if (!headers_sent()) {
setcookie('user', 'JohnDoe', time() + 3600, '/');
} else {
echo "無法設置 cookie,因為頭部已發送。";
}
如果你經常遇到頭部發送錯誤,可以考慮在腳本開頭啟用輸出緩衝:
ob_start();
這樣所有輸出會先進入緩衝區,而不是立刻發送給瀏覽器,直到腳本結束或調用ob_end_flush() ,給你留出更多時間來安全地發送頭部信息。