在 PHP 有一種很常見的 Warning 錯誤是 headers already sent, 出現時類似這樣:
Warning: Cannot modify header information – headers already sent by (output started at /path/to/file.php:20) in /path/to/file on line 23
這是在使用 session, setcookie 或 header 前, 有輸出內容所致, 輸出的不一定是文字, 可以是空格或空行。所以解決方法是將這些函數前的網頁輸出移除, 或者放在以上函數後便可以。
例如要用 PHP 的 header() 函數來轉址, 寫法是這樣:
|
1 2 3 |
<?php header("Location: http://www.phpini.com/"); ?> |
以上程式碼會將網頁轉址到 http://www.phpini.com/, 但如果在 header() 函數前有輸出內容, 便會出現錯誤:
|
1 2 3 4 |
<?php echo "Hello World!"; header("Location: http://www.phpini.com/"); ?> |
以上程式碼, 由於在 header() 函數前有用 echo 印出”Hello World!”, 所以會出現 “headers already sent” 錯誤。再看另一個例子:
|
1 2 3 4 5 6 7 8 |
<html> <head><title>Hello World!</title></head> <body> <?php header("Location: http://www.phpini.com/"); ?> </body> </html> |
以上 PHP 程式碼雖然 header() 函數前沒有 echo 或 print, 但由於已經有 HTML 輸出, 所以同樣會出現 “headers already sent” 錯誤。
要解決以上錯誤, 最簡單是將 header() 函數放到網頁輸出前面。
另一個方法是使用 ob_start(), 在檔案開頭加上 ob_start(), 及最後加上 ob_end_flush(), 例如:
|
1 2 3 4 5 6 |
<?php ob_start(); echo "Hello World!"; header("Location: http://www.phpini.com/"); ob_end_flush(); ?> |
除了修改 PHP 程式碼外, 還可以修改 php.ini 設定, 開啟 php.ini 檔案, 找到 “output_buffering” 一行, 預設是 Off, 改成 On 後重新啟動 Apache 便可以了。