近幾天正冰在測試有關跨域名cookies存儲問題,在某個php測試頁面裏的header函數一直遭遇:Warning: Cannot modify header information - headers already sent by錯誤提示。爲了解決該問題,翻山越嶺地用google查詢了相關資料,形成該問題的緣由是:函數 header(),setcookie() 和 session 函數須要在輸出流中增長頭信息。可是頭信息只能在其它任何輸出內容以前發送。在使用這些函數前不能有任何(如 HTML)的輸出。函數 headers_sent() 可以檢查您的腳本是否已經發送了頭信息。php
來繼續瞭解下原理:PHP腳本開始執行時,它能夠同時發送header(標題)信息和主體信息。 Header信息(來自 header() 或 SetCookie() 函數)並不會當即發送,相反,它被保存到一個列表中。 這樣就能夠容許你修改標題信息,包括缺省的標題(例如 Content-Type 標題)。可是,一旦腳本發送了任何非標題的輸出(例如,使用 HTML 或 print() 調用),那麼PHP就必須先發送完全部的Header,而後終止 HTTP header。然後繼續發送主體數據。從這時開始,任何添加或修改Header信息的試圖都是不容許的,並會發送上述的錯誤消息之一。跨域
解決方案以下(須保證出錯函數以前沒有任何輸出):cookie
一、若是說這條僅僅只是錯誤提示,並不影響你程序正常運做,那麼只須要「屏蔽」它便可。在頁面頂部的php標籤中加入ob_start();,在返回的信息下面加入ob_end_flush();,這樣就能夠屏蔽錯誤信息。session
<?php ob_start(); ?>函數
... HTML codes ...測試
<?phpgoogle
... PHP codes ...spa
header ("Location: ....");code
ob_end_flush();orm
?>
二、反之要完全解決,正冰是經過Notepa