php header()的用法詳解

2020-07-16 10:06:17

php header的作用就是傳送原生HTTP頭,其語法是「header ( string $string [, bool $replace = true [, int $http_response_code ]] ) : void」。

php header()的用法詳解

(PHP 4, PHP 5, PHP 7)

header — 傳送原生 HTTP 頭

說明

header ( string $string [, bool $replace = true [, int $http_response_code ]] ) : void

header() 用於傳送原生的 HTTP 頭。

請注意 header() 必須在任何實際輸出之前呼叫,不管是普通的 HTML 標籤,還是檔案或 PHP 輸出的空行,空格。這是個常見的錯誤,在通過include,require,或者其存取其他檔案裡面的函數的時候,如果在header()被呼叫之前,其中有空格或者空行。 同樣的問題也存在於單獨的 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;
?>

引數

string

頭字串。

有兩種特別的頭。第一種以「HTTP/」開頭的 (case is not significant),將會被用來計算出將要傳送的HTTP狀態碼。 例如在 Apache 伺服器上用 PHP 指令碼來處理不存在檔案的請求(使用 ErrorDocument 指令), 就會希望指令碼響應了正確的狀態碼。

<?php
header("HTTP/1.0 404 Not Found");
?>

第二種特殊情況是「Location:」的頭資訊。它不僅把報文傳送給瀏覽器,而且還將返回給瀏覽器一個 REDIRECT(302)的狀態碼,除非狀態碼已經事先被設定為了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

可選引數 replace 表明是否用後面的頭替換前面相同型別的頭。 預設情況下會替換。如果傳入 FALSE,就可以強制使相同的頭資訊並存。例如:

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

http_response_code

強制指定HTTP響應的值。注意,這個引數只有在報文字串(string)不為空的情況下才有效。

返回值

沒有返回值。

更新紀錄檔:

5.1.2 這個函數現在可以一次性阻止多個報文資訊的傳送,從而作為對報文資訊注入攻擊的一種防護。

Example #1 下載對話方塊

如果你想提醒使用者去儲存你傳送的資料,例如儲存一個生成的PDF檔案。你可以使用? Content-Disposition的報文資訊來提供一個推薦的檔名,並且強制瀏覽器顯示一個檔案下載的對話方塊。

<?php
// We'll be outputting a PDF
header('Content-type: application/pdf');
// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// The PDF source is in original.pdf
readfile('original.pdf');
?>

Example #2 快取指令

PHP指令碼總是會生成一些動態內容,而這些內容是不應該被快取的,不管是用戶端瀏覽器還是在伺服器端和用戶端瀏覽器之間的任何代理。我們可以像這樣來強制設定瀏覽器和各個代理層不快取資料:

<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>

Note:

也許你會遇到這樣的情況,那就是即使你沒使用上面這段程式碼,你的頁面也沒有被快取。大多數情況是因為使用者可以自己設定他們的瀏覽器從而改變瀏覽器預設的快取行為。一旦傳送了上面這段報文資訊,那麼你就應該重寫那些可能用到快取了的程式碼。

此外,在啟用session的情況下,session_cache_limiter()和session.cache_limiter的設定可以用來自動地生成正確的快取相關的頭資訊。

注釋

Note:

資料頭只會在SAPI支援時得到處理和輸出。

Note:

你所有需要輸出到瀏覽器的資料將會一直快取在伺服器端,直到你傳送他們,這將造成比較大的資源開銷。你可以是用輸出緩衝來避開這個問題。你可以通過在指令碼裡使用ob_start()和ob_end_flush()或者直接在你的php.ini檔案裡設定output_buffering,也可以直接在伺服器的組態檔裡設定。

Note:

HTTP狀態資訊的報文永遠都是最新被傳送到用戶端的,而不管header()是否是在最先傳送的。報文狀態碼可能會被重寫,當呼叫header()來設定新的狀態碼,除非HTTP報文已經被傳送了。

Note:

在IE 4.01和IE 5.5裡有bug,要解決就升級瀏覽器吧,想必也沒人用那麼遠古的神器了吧。

Note: 如果安全模式(safe mode)被啟用,那麼指令碼的uid將會被新增到WWW-Authenticate的realm部分,前提是你設定了這個頭資訊的情況下(使用 HTTP 認證)。

Note:

HTTP/1.1需要一個絕對的網路資源地址(URI)來作為一個引數供? Location:使用,在其中必須包含了協定,主機地址還有完整的路徑,但是一些用戶端可以接受相對的網路資源地址。你可以在一個相對的網路資源地址的基礎上使用$_SERVER['HTTP_HOST'],$_SERVER['PHP_SELF']和dirname()來組裝一個絕對的網路資源地址。

<?php
/* Redirect to a different page in the current directory that was requested */
$host  = $_SERVER['HTTP_HOST'];
$uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/');
$extra = 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;
?>

Note:

在執行Location header跳轉的時候,Session ID無法通傳遞的,即使session.use_trans_sid是啟用狀態的。只能通過手動傳遞using SID的值來實現。

很多相關知識,請存取PHP中文網

以上就是php header()的用法詳解的詳細內容,更多請關注TW511.COM其它相關文章!