PHP header詳解

header

(PHP 3, PHP 4, PHP 5)

header -- 發送一個原始 HTTP 標頭

說明

void header ( string string [, bool replace [, int http_response_code]] )

header() 函數用來發送一個原始 HTTP 標頭。有關 HTTP 標頭的更多內容見 HTTP/1.1 規範

可選參數 replace 指明是替換掉前一條類似的標頭還是增加一條相同類型的標頭。默認爲替換,但如果將其設爲 FALSE 則可以強制發送多個同類標頭。例如:

 

 

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

第二個可選參數 http_response_code 強制將 HTTP 響應代碼設爲指定值(此參數是 PHP 4.3.0 新加的)。

有兩種特殊的 header 調用。第一種是標頭以字符串“HTTP/”(大小寫不重要)開頭的,可以用來確定要發送的 HTTP 狀態碼。例如,如果配置了 Apache 用 PHP 來處理找不到文件的錯誤處理請求(使用 ErrorDocument 指令),需要確保腳本產生了正確的狀態碼。

 

 

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

注: HTTP 狀態碼標頭行總是第一個被髮送到客戶端,而並不管實際的 header() 調用是否是第一個。除非 HTTP 標頭已經發送出去,任何時候都可以通過用新的狀態行調用 header() 函數來覆蓋原先的。

第二種特殊情況是以“Location:”標頭。它不只是把這個標頭髮送回瀏覽器,它還將一個 REDIRECT(302)狀態碼返回給瀏覽器,除非之前已經發出了某個 3xx 狀態碼。

 

 

<?php
header
("Location: http://www.example.com/");
/* 重定向瀏覽器 */

/* 確保重定向後,後續代碼不會被執行 */
exit;
?>

注: HTTP/1.1 標準需要一個絕對地址的 URI 做爲 Location: 的參數, 但有一些客戶端支持相對 URI。通常可以使用 $_SERVER['HTTP_HOST']$_SERVER['PHP_SELF']dirname() 函數來自己從相對 URI 產生出絕對 URI:

 

<?php
header("Location: http://".

header

(PHP 3, PHP 4, PHP 5)

header -- 發送一個原始 HTTP 標頭

說明

void header ( string string [, bool replace [, int http_response_code]] )

header() 函數用來發送一個原始 HTTP 標頭。有關 HTTP 標頭的更多內容見 HTTP/1.1 規範

可選參數 replace 指明是替換掉前一條類似的標頭還是增加一條相同類型的標頭。默認爲替換,但如果將其設爲 FALSE 則可以強制發送多個同類標頭。例如:

 

 

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

第二個可選參數 http_response_code 強制將 HTTP 響應代碼設爲指定值(此參數是 PHP 4.3.0 新加的)。

有兩種特殊的 header 調用。第一種是標頭以字符串“HTTP/”(大小寫不重要)開頭的,可以用來確定要發送的 HTTP 狀態碼。例如,如果配置了 Apache 用 PHP 來處理找不到文件的錯誤處理請求(使用 ErrorDocument 指令),需要確保腳本產生了正確的狀態碼。

 

 

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

注: HTTP 狀態碼標頭行總是第一個被髮送到客戶端,而並不管實際的 header() 調用是否是第一個。除非 HTTP 標頭已經發送出去,任何時候都可以通過用新的狀態行調用 header() 函數來覆蓋原先的。

第二種特殊情況是以“Location:”標頭。它不只是把這個標頭髮送回瀏覽器,它還將一個 REDIRECT(302)狀態碼返回給瀏覽器,除非之前已經發出了某個 3xx 狀態碼。

 

 

<?php
header
("Location: http://www.example.com/");
/* 重定向瀏覽器 */

/* 確保重定向後,後續代碼不會被執行 */
exit;
?>

注: HTTP/1.1 標準需要一個絕對地址的 URI 做爲 Location: 的參數, 但有一些客戶端支持相對 URI。通常可以使用 $_SERVER['HTTP_HOST']$_SERVER['PHP_SELF']dirname() 函數來自己從相對 URI 產生出絕對 URI:

 

___FCKpd___0

 

 

注: 即使啓用了 session.use_trans_sid,Session ID 也不會隨着 Location 頭信息被傳遞。必須手工用 SID 常量來傳遞。

PHP 腳本通常會產生一些動態內容,這些內容必須不被瀏覽器或代理服務器緩存。很多代理服務器和瀏覽器都可以被下面的方法禁止緩存:

 

 

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

注: 可能會發現即使不輸出上面所有的代碼,網頁也沒有被緩衝。用戶有很多選項可以設置來改變瀏覽器的默認緩存行爲。通過發送上述標頭,應該可以覆蓋任何可以導致腳本頁面被緩存的設置。

另外,當使用了 session 時,利用 session_cache_limiter() 函數和 session.cache_limiter 選項可以用來自動產生正確的緩存相關標頭。

要記住 header() 必須在任何實際輸出之前調用,不論是來自普通的 HTML 標記,空行或者 PHP。有一個常見錯誤就是在通過 include()require() 或一些其它的文件存取類函數讀取代碼時,有一些空格或者空行在調用 header() 之前被髮送了出去。同樣在一個單獨的 PHP/HTML 文件中這個錯誤也很普遍。

 

 

<html>
<?php
/* 這將產生一個錯誤,因爲在調 header()
* 之前已經輸出了東西 */
header('Location: http://www.example.com/'
);
?>

注: 自 PHP 4 起,可以通過一些輸出緩衝函數來解決這個問題。代價是把所有向瀏覽器的輸出都緩存在服務器,直到下命令發送它們。可以在代碼中使用 ob_start()ob_end_flush() 來實現這樣的功能,或者通過修改 php.ini 中的 output_buffering 配置選項來實現,也可以通過修改服務器配置文件來實現。

如果想提示用戶保存所發送的數據,例如一個生成的 PDF 文件,可以通過發送 Content-Disposition 標頭提供推薦的文件名來強制瀏覽器彈出一個保存文件對話框。

 

 

<?php
// 這樣將會直接輸出一個 PDF 文件
header('Content-type: application/pdf'
);

// 這樣做就會提示下載 PDF 文件 downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"'
);

// 這是 original.pdf 的源文件
readfile('original.pdf'
);
?>

注: Microsoft Internet Explorer 4.01 中的一個漏洞使得該機制無法正常工作,無解決方案。在 Microsoft Internet Explorer 5.5 中也有個漏洞影響到這一點,升級到 Service Pack 2 或更高版本可以解決。

注: 安全模式下,如果設定了 WWW-Authenticate 標頭(用於 HTTP 認證)則腳本的 UID 會添加到其中的 realm 部分中去。

 
SERVER['HTTP_HOST']                         . rtrim(dirname(

header

(PHP 3, PHP 4, PHP 5)

header -- 發送一個原始 HTTP 標頭

說明

void header ( string string [, bool replace [, int http_response_code]] )

header() 函數用來發送一個原始 HTTP 標頭。有關 HTTP 標頭的更多內容見 HTTP/1.1 規範

可選參數 replace 指明是替換掉前一條類似的標頭還是增加一條相同類型的標頭。默認爲替換,但如果將其設爲 FALSE 則可以強制發送多個同類標頭。例如:

 

 

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

第二個可選參數 http_response_code 強制將 HTTP 響應代碼設爲指定值(此參數是 PHP 4.3.0 新加的)。

有兩種特殊的 header 調用。第一種是標頭以字符串“HTTP/”(大小寫不重要)開頭的,可以用來確定要發送的 HTTP 狀態碼。例如,如果配置了 Apache 用 PHP 來處理找不到文件的錯誤處理請求(使用 ErrorDocument 指令),需要確保腳本產生了正確的狀態碼。

 

 

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

注: HTTP 狀態碼標頭行總是第一個被髮送到客戶端,而並不管實際的 header() 調用是否是第一個。除非 HTTP 標頭已經發送出去,任何時候都可以通過用新的狀態行調用 header() 函數來覆蓋原先的。

第二種特殊情況是以“Location:”標頭。它不只是把這個標頭髮送回瀏覽器,它還將一個 REDIRECT(302)狀態碼返回給瀏覽器,除非之前已經發出了某個 3xx 狀態碼。

 

 

<?php
header
("Location: http://www.example.com/");
/* 重定向瀏覽器 */

/* 確保重定向後,後續代碼不會被執行 */
exit;
?>

注: HTTP/1.1 標準需要一個絕對地址的 URI 做爲 Location: 的參數, 但有一些客戶端支持相對 URI。通常可以使用 $_SERVER['HTTP_HOST']$_SERVER['PHP_SELF']dirname() 函數來自己從相對 URI 產生出絕對 URI:

 

___FCKpd___0

 

 

注: 即使啓用了 session.use_trans_sid,Session ID 也不會隨着 Location 頭信息被傳遞。必須手工用 SID 常量來傳遞。

PHP 腳本通常會產生一些動態內容,這些內容必須不被瀏覽器或代理服務器緩存。很多代理服務器和瀏覽器都可以被下面的方法禁止緩存:

 

 

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

注: 可能會發現即使不輸出上面所有的代碼,網頁也沒有被緩衝。用戶有很多選項可以設置來改變瀏覽器的默認緩存行爲。通過發送上述標頭,應該可以覆蓋任何可以導致腳本頁面被緩存的設置。

另外,當使用了 session 時,利用 session_cache_limiter() 函數和 session.cache_limiter 選項可以用來自動產生正確的緩存相關標頭。

要記住 header() 必須在任何實際輸出之前調用,不論是來自普通的 HTML 標記,空行或者 PHP。有一個常見錯誤就是在通過 include()require() 或一些其它的文件存取類函數讀取代碼時,有一些空格或者空行在調用 header() 之前被髮送了出去。同樣在一個單獨的 PHP/HTML 文件中這個錯誤也很普遍。

 

 

<html>
<?php
/* 這將產生一個錯誤,因爲在調 header()
* 之前已經輸出了東西 */
header('Location: http://www.example.com/'
);
?>

注: 自 PHP 4 起,可以通過一些輸出緩衝函數來解決這個問題。代價是把所有向瀏覽器的輸出都緩存在服務器,直到下命令發送它們。可以在代碼中使用 ob_start()ob_end_flush() 來實現這樣的功能,或者通過修改 php.ini 中的 output_buffering 配置選項來實現,也可以通過修改服務器配置文件來實現。

如果想提示用戶保存所發送的數據,例如一個生成的 PDF 文件,可以通過發送 Content-Disposition 標頭提供推薦的文件名來強制瀏覽器彈出一個保存文件對話框。

 

 

<?php
// 這樣將會直接輸出一個 PDF 文件
header('Content-type: application/pdf'
);

// 這樣做就會提示下載 PDF 文件 downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"'
);

// 這是 original.pdf 的源文件
readfile('original.pdf'
);
?>

注: Microsoft Internet Explorer 4.01 中的一個漏洞使得該機制無法正常工作,無解決方案。在 Microsoft Internet Explorer 5.5 中也有個漏洞影響到這一點,升級到 Service Pack 2 或更高版本可以解決。

注: 安全模式下,如果設定了 WWW-Authenticate 標頭(用於 HTTP 認證)則腳本的 UID 會添加到其中的 realm 部分中去。

 
SERVER['PHP_SELF']), '///')                        ."/".$relative_url); ?>

 

 

注: 即使啓用了 session.use_trans_sid,Session ID 也不會隨着 Location 頭信息被傳遞。必須手工用 SID 常量來傳遞。

PHP 腳本通常會產生一些動態內容,這些內容必須不被瀏覽器或代理服務器緩存。很多代理服務器和瀏覽器都可以被下面的方法禁止緩存:

 

 

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

注: 可能會發現即使不輸出上面所有的代碼,網頁也沒有被緩衝。用戶有很多選項可以設置來改變瀏覽器的默認緩存行爲。通過發送上述標頭,應該可以覆蓋任何可以導致腳本頁面被緩存的設置。

另外,當使用了 session 時,利用 session_cache_limiter() 函數和 session.cache_limiter 選項可以用來自動產生正確的緩存相關標頭。

要記住 header() 必須在任何實際輸出之前調用,不論是來自普通的 HTML 標記,空行或者 PHP。有一個常見錯誤就是在通過 include()require() 或一些其它的文件存取類函數讀取代碼時,有一些空格或者空行在調用 header() 之前被髮送了出去。同樣在一個單獨的 PHP/HTML 文件中這個錯誤也很普遍。

 

 

<html>
<?php
/* 這將產生一個錯誤,因爲在調 header()
* 之前已經輸出了東西 */
header('Location: http://www.example.com/'
);
?>

注: 自 PHP 4 起,可以通過一些輸出緩衝函數來解決這個問題。代價是把所有向瀏覽器的輸出都緩存在服務器,直到下命令發送它們。可以在代碼中使用 ob_start()ob_end_flush() 來實現這樣的功能,或者通過修改 php.ini 中的 output_buffering 配置選項來實現,也可以通過修改服務器配置文件來實現。

如果想提示用戶保存所發送的數據,例如一個生成的 PDF 文件,可以通過發送 Content-Disposition 標頭提供推薦的文件名來強制瀏覽器彈出一個保存文件對話框。

 

 

<?php
// 這樣將會直接輸出一個 PDF 文件
header('Content-type: application/pdf'
);

// 這樣做就會提示下載 PDF 文件 downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"'
);

// 這是 original.pdf 的源文件
readfile('original.pdf'
);
?>

注: Microsoft Internet Explorer 4.01 中的一個漏洞使得該機制無法正常工作,無解決方案。在 Microsoft Internet Explorer 5.5 中也有個漏洞影響到這一點,升級到 Service Pack 2 或更高版本可以解決。

注: 安全模式下,如果設定了 WWW-Authenticate 標頭(用於 HTTP 認證)則腳本的 UID 會添加到其中的 realm 部分中去。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章