函數header作用
頁面跳轉
http頭信息
頭信息的作用很多最主要的有下面幾個
跳轉
當浏覽器接受到頭信息中的 Location: xxxx 後就會自動跳轉到 xxxx 指向的URL地址這點有點類似用 js 寫跳轉但是這個跳轉只有浏覽器知道不管體內容裡有沒有東西用戶都看不到
例header("Location:
指定網頁的內容
同樣一個XML文件如果頭信息中指定Contenttype: application/xml 的話浏覽器會將其按照XML文件格式解析但是如果頭信息中是Contenttype: text/xml 的話浏覽器就會將其看作存文本解析(浏覽器不是按照擴展名解析文件的)
例header(Contenttype: application/pdf);
附件
不知道大家有沒有注意有些時候在一些網站下載東西點下載連接以後結果浏覽器將這個附件當成網頁打開了裡面顯示的都是亂碼這個問題也和頭信息有關有時候浏覽器根據Contenttype 來判斷是打開還是保存這樣有時就會判斷錯誤(主要是網站設計者忘記寫Contenttype)其實還有一個可以來指定該內容為附件需要保存這個就是ContentDisposition: attachment; filename="xxxxx"
例header(ContentDisposition: attachment; filename="downloadedpdf");
//打開文件並輸出
readfile(originalpdf);
HTTP協議狀態碼
×× 保留
×× 表示請求成功地接收
×× 為完成請求客戶需進一步細化請求
×× 客戶錯誤
×× 服務器錯誤
語法
header(stringreplacehttp_response_code)
參數
string必需規定要發送的報頭字符串
replace可選指示該報頭是否替換之前的報頭或添加第二個報頭默認是 true(替換)false(允許相同類型的多個報頭)
http_response_code可選把 HTTP 響應代碼強制為指定的值(PHP 以及更高版本可用)
例
重定向網頁
<?php
header("Location:
exit;
?>
例
強制用戶每次訪問這個頁面時獲取最新資料而不是使用存在客戶端的緩存
<?php
//告訴浏覽器此頁面的過期時間(用格林威治時間表示)只要是已經過去的日期即可
header("Expires:Mon Jul :: GMT");
//告訴浏覽器此頁面的最後更新日期(用格林威治時間表示)也就是當天目的就是強迫浏覽器獲取最新資料
header("LastModified:"gmdate("Dd M Y H:i:s")"GMT");
//告訴客戶端浏覽器不使用緩存
header("CacheControl: nocache mustrevalidate");
//參數(與以前的服務器兼容)即兼容HTTP協議
header("Pragma: nocache");
?>
例
輸出狀態值到浏覽器主要用於訪問權限控制
<?php
header(HTTP/ Unauthorized);
header(status: Unauthorized);
?>
例
要限制一個用戶不能訪問該頁則可設置狀態為如下所示這樣浏覽器就顯示為即該頁不存在
<?php
header(HTTP/ Not Found);
header("status: Not Found"); //這種寫法錯誤
?>
例
隱藏文件的位置
html標簽 <A http://hostname/*mp></a>就可以實現普通文件下載如果為了保密文件就不能把文件鏈接告訴別人可以用header函數實現文件下載
header("Contenttype: audio/mpeg");
header("ContentDisposition: attachment; filename=filenale");
header("ContentDescription: PHP Generated Data");
例
header函數前輸入內容
一般來說在header函數前不能輸出html內容類似的還有setcookie() 和 session 函數這些函數需要在輸出流中增加消息頭部信息如果在header()執行之前有echo等語句當後面遇到header()時就會報出 “Warning: Cannot modify header information headers already sent by ”錯誤就是說在這些函數的前面不能有任何文字空行回車等而且最好在header()函數後加上exit()函數例如下面的錯誤寫法在兩個php代碼段之間有一個空行
<?php
//some code here
?>
//這裡應該是一個空行
<?php
header("
exit();
?>
原因
PHP腳本開始執行 時它可以同時發送http消息頭部(標題)信息和主體信息 http消息頭部(來自 header() 或SetCookie() 函數)並不會立即發送相反它被保存到一個列表中 這樣就可以允許你修改標題信息包括缺省的標題(例如ContentType 標題)但是一旦腳本發送了任何非標題的輸出(例如使用 HTML 或 print()調用)那麼PHP就必須先發送完所有的Header然後終止 HTTPheader而後繼續發送主體數據從這時開始任何添加或修改Header信息的試圖都是不允許的並會發送上述的錯誤消息之一
解決辦法
修改phpini打開緩存(output_buffering)將output_buffering=修改成output_buffering=
或者在程序中使用緩存函數ob_start()ob_end_flush() 等原理是output_buffering被啟用時在腳本發送輸出時PHP並不發送HTTPheader相反它將此輸出通過管道(pipe)輸入到動態增加的緩存中(只能在PHP中使用它具有中央化的輸出機制)你仍然可以修改/添加header或者設置cookie因為 header實際上並沒有發送當全部腳本終止時PHP將自動發送HTTP header到浏覽器然後再發送輸出緩沖中的內容
From:http://tw.wingwit.com/Article/program/PHP/201311/21229.html