在瀏覽器訪問一個網頁時,服務器首先通過HTTP 協議與瀏覽器建立通信。這個過程包括發送HTTP 頭部信息和隨後的HTML 內容。 HTTP 頭部信息不僅包含了網頁的基本信息(如內容類型、字符集等),還決定了瀏覽器如何處理頁面的顯示、緩存、跳轉等行為。
在PHP 中,我們使用header()函數來發送HTTP 頭部。例如,以下代碼會讓瀏覽器重定向到一個新的頁面:
<?php
header("Location: http://m66.net/newpage.php");
exit;
?>
當這段代碼執行時,服務器會發送一個重定向頭部( Location ),然後瀏覽器會根據這個頭部信息進行跳轉。此時,PHP 腳本會停止執行(由於exit() ),所以後續的HTML 內容不會輸出。
在PHP 中,HTTP 頭部必須在任何HTML 輸出之前發送。這是因為HTTP 頭部信息是由服務器先發送的,而HTML 內容則是隨後的數據。如果你在PHP 中先輸出了HTML 內容或任何其他字符,再調用header()函數,PHP 將會報錯,提示“headers already sent”(頭部已經發送)。
例如,下面的代碼會出錯:
<?php
echo "Hello World!"; // 輸出了 HTML 內容
header("Location: http://m66.net/newpage.php"); // 嘗試發送重定向頭部
exit;
?>
這段代碼執行時,會拋出一個警告,提示頭部已經被發送。原因就是echo語句已經輸出了HTML 內容,導致HTTP 頭部無法再發送。
在HTTP 協議中,頭部信息必須在實際的頁面內容(HTML、圖片、CSS 等)之前發送。瀏覽器根據收到的頭部信息來決定如何處理接收到的頁面。舉個例子, Location頭部指示瀏覽器應該進行重定向,而Content-Type則告訴瀏覽器當前頁面的內容類型。
PHP 需要在輸出HTML 內容之前通過header()函數發送這些頭部,因為一旦HTML 開始被發送到瀏覽器,服務器就無法再更改HTTP 頭部。為了保證能夠成功修改HTTP 頭部(比如進行重定向),你必須確保header()在任何輸出之前被調用。
雖然PHP 要求在輸出任何HTML 內容之前調用header() ,但是在某些情況下,輸出緩衝(Output Buffering)可以幫助解決這一問題。輸出緩衝允許PHP 在實際發送HTML 內容之前先將其存儲在內存中,這樣就可以在後續調用header()時不受已輸出內容的影響。
使用輸出緩衝的代碼示例如下:
<?php
ob_start(); // 開啟輸出緩衝
echo "Hello World!"; // 仍然可以输出內容
header("Location: http://m66.net/newpage.php"); // 發送頭部
exit;
?>
在上述代碼中, ob_start()函數啟用了輸出緩衝,這樣即使在echo後輸出了內容,PHP 也不會立刻將這些內容髮送到瀏覽器,而是將它們存儲在緩衝區中。這允許你後續調用header()函數來修改HTTP 頭部,而不會遇到“headers already sent”錯誤。
頁面重定向:使用header("Location: URL")來將用戶重定向到另一個頁面。
header("Location: http://m66.net/anotherpage.php");
exit;
設置內容類型:使用header("Content-Type: type")來設置頁面的內容類型,例如:
header("Content-Type: application/json");
echo json_encode($data);
控制緩存:使用header()來設置緩存控制,指示瀏覽器是否應該緩存某個頁面。
header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");
PHP 的header()函數用於發送HTTP 頭部信息,它的調用順序對頁面的輸出順序至關重要。由於HTTP 頭部必須在HTML 內容之前發送,因此調用header()時必須確保沒有輸出任何內容。為了解決這一問題,輸出緩衝可以作為一種有效的解決方案。理解header()函數與頁面輸出順序的關係,有助於避免因不正確的調用順序而導致的錯誤和意外行為。
通過合理使用header()函數和輸出緩衝,你可以確保PHP 腳本按預期工作,避免遇到不必要的錯誤。