PHP Header失效的緣由分析

在PHP中用header("location:test.php")進行跳轉要注意如下幾點:
一、location和「:」號間不能有空格,不然會出錯。
二、在用header前不能有任何的輸出,包括include的頁面中標籤「?>」後不能有空格!!
三、header後的PHP代碼還會被執行。

續:
問題:header函數前輸入內容
通常來講在header函數前不能輸出html內容,相似的還有setcookie() 和 session 函數,這些函數須要在輸出流中增長消息頭部信息。若是在header()執行以前有echo等語句,當後面遇到header()時,就會報出 「Warning: Cannot modify header information – headers already sent by ….」錯誤。就是說在這些函數的前面不能有任何文字、空行、回車等,並且最好在header()函數後加上exit()函數。例以下面的錯誤寫法,在 兩個php代碼段之間有一個空行:

<?php
//some code here
?>
//這裏應該是一個空行
<?php
header(「http/1.1 403 Forbidden」);
exit();
?>
緣由:
PHP腳本開始執行 時,它能夠同時發送http消息頭部(標題)信息和主體信息. http消息頭部(來自 header() 或SetCookie() 函數)並不會當即發送,相反,它被保存到一個列表中. 這樣就能夠容許你修改標題信息,包括缺省的標題(例如Content-Type 標題).可是,一旦腳本發送了任何非標題的輸出(例如,使用 HTML 或 print()調用),那麼PHP就必須先發送完全部的Header,而後終止 HTTPheader.然後繼續發送主體數據.從這時開始,任何添加或修改Header信息的試圖都是不容許的,並會發送上述的錯誤消息之一。

解決辦法:
修改php.ini打開緩存(output_buffering),將output_buffering=0修改爲output_buffering=4096
或 者在程序中使用緩存函數ob_start(),ob_end_flush() 等。原理是:output_buffering被啓用時,在腳本發送輸出時,PHP並不發送HTTPheader。相反,它將此輸出經過管道(pipe) 輸入到動態增長的緩存中(只能在PHP4.0中使用,它具備中央化的輸出機制)。你仍然能夠修改/添加header,或者設置cookie,由於 header實際上並無發送。當所有腳本終止時,PHP將自動發送HTTP header到瀏覽器,而後再發送輸出緩衝中的內容。

轉載自:http://www.9958.pw/post/php_headerphp

相關文章
相關標籤/搜索