PHP 中 header()函數的做用是給客戶端發送頭信息。php
什麼是頭信息?
這裏只做簡單解釋,詳細的本身看http協議。
在 HTTP協議中,服務器端的回答(response)內容包括兩部分:頭信息(header) 和 體內容,這裏的頭信息不是HTML中的<head></head>部分,一樣,體內容也不是<BODY>< /BODY>。頭信息是用戶看不見的,裏面包含了不少項,包括:服務器信息、日期、內容的長度等。而體內容就是整個HTML,也就是你所能看見的全 部東西。html
頭信息有什麼用呢?
頭信息的做用不少,最主要的有下面幾個:web
一、跳轉:當瀏覽器接受到頭信息中的 Location: xxxx 後,就會自動跳轉到 xxxx 指向的URL地址,這點有點相似用 js 寫跳轉。可是這個跳轉只有瀏覽器知道,無論體內容裏有沒有東西,用戶都看不到。瀏覽器
二、指定網頁的內容: 一樣一個XML文件,若是頭信息中指定:Content-type: application/xml 的話,瀏覽器會將其按照XML文件格式解析。可是,若是頭信息中是:Content-type: text/xml 的話,瀏覽器就會將其看做存文本解析。(瀏覽器不是按照擴展名解析文件的)緩存
三、附件: 不知道你們有沒有注意,有些時候在一些網站下載東西,點下載鏈接之後,結果瀏覽器將這個附件當成網頁打開 了,裏面顯示的都是亂碼,這個問題也和頭信息有關。有時候瀏覽器根據Content-type 來判斷是打開仍是保存,這樣有時就會判斷錯誤(主要是網站設計者忘記寫Content-type)。其實,還有一個能夠來指定該內容爲附件、須要保存,這 個就是:Content-Disposition: attachment; filename="xxxxx"服務器
// 指定內容爲附件
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// 打開文件,並輸出
readfile('original.pdf');app
最 後要提醒你們注意一點,全部頭信息都必須在體內容以前,若是一旦有任何輸出了的話,header函數寫的 頭信息就沒用了。好比,在文件最開頭的<?php 處,若是前面有空格或者有空行,那header函數就沒用了(其實能夠經過設置:output_buffer來解決,anyway),爲何這樣,能夠看 看HTTP協議,很簡單。函數
定義和用法網站
header() 函數向客戶端發送原始的 HTTP 報頭。spa
認識到一點很重要,即必須在任何實際的輸出被髮送以前調用 header() 函數(在 PHP 4 以及更高的版本中,您可使用輸出緩存來解決此問題):
<html>
<?php
// 結果出錯
// 在調用 header() 以前已存在輸出
header('Location: http://www.example.com/');
?>
語法
header(string,replace,http_response_code)
參數 | 描述 |
---|---|
string | 必需。規定要發送的報頭字符串。 |
replace |
可選。指示該報頭是否替換以前的報頭,或添加第二個報頭。 默認是 true(替換)。false(容許相同類型的多個報頭)。 |
http_response_code | 可選。把 HTTP 響應代碼強制爲指定的值。(PHP 4 以及更高版本可用) |
提示和註釋
註釋:從 PHP 4.4 以後,該函數防止一次發送多個報頭。這是對頭部注入攻擊的保護措施。
例子 1
<?php // Date in the pastheader("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-cache"); header("Pragma: no-cache");?> <html> <body>... ...
註釋:用戶可能會設置一些選項來更改瀏覽器的默認緩存設置。經過發送上面的報頭,您能夠覆蓋任何這些設置,強制瀏覽器不進行緩存!
例子 2
提示用戶保存一個生成的 PDF 文件(Content-Disposition 報頭用於提供一個推薦的文件名,並強制瀏覽器顯示保存對話框):
<?php header("Content-type:application/pdf"); //輸出的類型 // 文件將被稱爲 downloaded.pdf header("Content-Disposition:attachment;filename='downloaded.pdf'"); //下載顯示的名字,注意格式 // PDF 源在 original.pdf 中 readfile("original.pdf"); ?> <html> <body>