header

(PHP 4, PHP 5, PHP 7, PHP 8)

header發(fā)送原生 HTTP 頭

說明

header(string $string, bool $replace = true, int $response_code = ?): void

header() 用于發(fā)送原生的 HTTP 頭。關(guān)于 HTTP 頭的更多信息請參考 ? HTTP/1.1 specification。

請注意 header() 必須在任何實(shí)際輸出之前調(diào)用,不管是普通的 HTML 標(biāo)簽,還是文件或 PHP 輸出的空行,空格。這是個(gè)常見的錯(cuò)誤,在通過include,require,或者其訪問其他文件里面的函數(shù)的時(shí)候,如果在header()被調(diào)用之前,其中有空格或者空行。 同樣的問題也存在于單獨(dú)的 PHP/HTML 文件中。

<html>
<?php
/* This will give an error. Note the output
 * above, which is before the header() call */
header('Location: http://www.example.com/');
exit;
?>

參數(shù)

string

頭字符串。

有兩種特別的頭。第一種以“HTTP/”開頭的 (case is not significant),將會被用來計(jì)算出將要發(fā)送的HTTP狀態(tài)碼。 例如在 Apache 服務(wù)器上用 PHP 腳本來處理不存在文件的請求(使用 ErrorDocument 指令), 就會希望腳本響應(yīng)了正確的狀態(tài)碼。

<?php
// 本示例演示了 "HTTP/" 的特殊例子,典型用法的最佳實(shí)踐,包括:
// 1. header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
//    (覆蓋 http 狀態(tài)消息,兼容還在使用 HTTP/1.0 的客戶端)
// 2. http_response_code(404); (使用默認(rèn)消息)
header("HTTP/1.1 404 Not Found");
?>

第二種特殊情況是“Location:”的頭信息。它不僅把報(bào)文發(fā)送給瀏覽器,而且還將返回給瀏覽器一個(gè) REDIRECT(302)的狀態(tài)碼,除非狀態(tài)碼已經(jīng)事先被設(shè)置為了201或者3xx

<?php
header
("Location: http://www.example.com/"); /* Redirect browser */

/* Make sure that code below does not get executed when we redirect. */
exit;
?>

replace

可選參數(shù) replace 表明是否用后面的頭替換前面相同類型的頭。 默認(rèn)情況下會替換。如果傳入 false,就可以強(qiáng)制使相同的頭信息并存。例如:

<?php
header
('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM'false);
?>

response_code

強(qiáng)制指定 HTTP 響應(yīng)的值。注意,這個(gè)參數(shù)只有在報(bào)文字符串(header)不為空的情況下才有效。

返回值

沒有返回值。

錯(cuò)誤/異常

當(dāng) header 發(fā)送失敗時(shí),header() 會拋出 E_WARNING 級別的錯(cuò)誤

范例

示例 #1 下載對話框

如果你想提醒用戶去保存你發(fā)送的數(shù)據(jù),例如保存一個(gè)生成的PDF文件。你可以使用? Content-Disposition的報(bào)文信息來提供一個(gè)推薦的文件名,并且強(qiáng)制瀏覽器顯示一個(gè)文件下載的對話框。

<?php
// 輸出 PDF 文件
header('Content-type: application/pdf');

// 名稱為 downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// 該 PDF 來源于 original.pdf
readfile('original.pdf');
?>

示例 #2 緩存指令

PHP 腳本經(jīng)常生成一些動態(tài)內(nèi)容,它不該被客戶端、服務(wù)器與瀏覽器之間的代理緩存。 許多代理與客戶端都支持這樣強(qiáng)制禁用緩存:

<?php
header
("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // 過去的日期
?>

注意:

也許你會遇到這樣的情況,那就是即使你沒使用上面這段代碼,你的頁面也沒有被緩存。大多數(shù)情況是因?yàn)橛脩艨梢宰约涸O(shè)置他們的瀏覽器從而改變?yōu)g覽器默認(rèn)的緩存行為。一旦發(fā)送了上面這段報(bào)文信息,那么你就應(yīng)該重寫那些可能用到緩存了的代碼。

此外,在啟用session的情況下,session_cache_limiter()session.cache_limiter的配置可以用來自動地生成正確的緩存相關(guān)的頭信息。

注釋

注意:

數(shù)據(jù)頭只會在SAPI支持時(shí)得到處理和輸出。

注意:

你所有需要輸出到瀏覽器的數(shù)據(jù)將會一直緩存在服務(wù)器端,直到你發(fā)送他們,這將造成比較大的資源開銷。你可以是用輸出緩沖來避開這個(gè)問題。你可以通過在腳本里使用ob_start()ob_end_flush()或者直接在你的php.ini文件里設(shè)置output_buffering,也可以直接在服務(wù)器的配置文件里設(shè)置。

注意:

HTTP狀態(tài)信息的報(bào)文永遠(yuǎn)都是最新被發(fā)送到客戶端的,而不管header()是否是在最先發(fā)送的。報(bào)文狀態(tài)碼可能會被重寫,當(dāng)調(diào)用header()來設(shè)定新的狀態(tài)碼,除非HTTP報(bào)文已經(jīng)被發(fā)送了。

注意:

絕大多數(shù)現(xiàn)代瀏覽器的 ? Location: 都支持相對 URI,但也有一些舊瀏覽器需要絕對 URI:包含協(xié)議、主機(jī)名、絕對路徑。 一般情況下,可以借助 $_SERVER['HTTP_HOST']、$_SERVER['PHP_SELF']dirname() 將相對地址組合成絕對 URI:

<?php
/* 根據(jù)當(dāng)前請求所在的目錄,重定向到不同的頁面 */
$host  $_SERVER['HTTP_HOST'];
$uri   rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;
?>

注意:

在執(zhí)行Location header跳轉(zhuǎn)的時(shí)候,Session ID無法通傳遞的,即使session.use_trans_sid是激活狀態(tài)的。只能通過手動傳遞using SID的值來實(shí)現(xiàn)。

參見