php header 函式詳解

2021-05-21 19:13:19 字數 3875 閱讀 1034

.一、作用:  

php只是以http協議將html文件的標頭送到瀏覽器,告訴瀏覽器具體怎麼處理這個頁面,至於傳送的內容則需要熟悉一下http協議了,與php無關了,可參照http://www.w3.org/protocols/rfc2616/rfc2616。 

傳統的標頭一定包含下面三種標頭之一,並只能出現一次。 

location:    ***x:yyyy/zzzz 

content-type:    ***x/yyyy 

status:    nnn    ****** 

三、http協議狀態碼表示的意思 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

1××  保留 

2××  表示請求成功地接收 

3××  為完成請求客戶需進一步細化請求 

4××  客戶錯誤 

5××  伺服器錯誤 

header()函式的作用是:傳送乙個原始 http 標頭[http header]到客戶端。

標頭 (header) 是伺服器以 http 協義傳 html 資料到瀏覽器前所送出的字串,在標頭

與 html 檔案之間尚需空一行分隔。有關 http 的詳細說明,可以參 rfc 2068 官方檔案

在 php 中送回 html 資料前,需先 傳完所有的標頭。

使用範例

範例一: 本例使瀏覽器重定向到 php 的官方**。

exit;   //在每個重定向之後都必須加上「exit",避免發生錯誤後,繼續執行。

?>

<?php

/**

@title:php定時跳轉

@功能:等待指定的時間,然後再跳轉到指定頁面(代替html meta方式)

print('正在載入,請稍等...

三秒後自動跳轉~~~');

/* 補充說明:

若等待時間為0,則與header("location:")等效。

*/ header重定向 就等價於替使用者在位址列輸入url

?>  

範例二:禁止頁面在ie中快取

要使用者每次都能得到最新的資料,而不是 proxy 或 cache 中的資料,可以使用下列的標頭

<?php

header( 'expires: mon, 26 jul 1997 05:00:00 gmt' );

header( 'last-modified: ' . gmdate( 'd, d m y h:i:s' ) . ' gmt' );

header( 'cache-control: no-store, no-cache, must-revalidate' );

header( 'cache-control: post-check=0, pre-check=0', false );

header( 'pragma: no-cache' ); //相容http1.0和https

?>

cachecontrol = no-cache

pragma=no-cache

expires = -1

expires是個好東東,如果伺服器上的網頁經常變化,就把它設定為-1,表示立即過期。如果乙個網頁每天凌晨1點更新,可以把expires設定為第二天的凌晨1點。

當http1.1伺服器指定cachecontrol = no-cache時,瀏覽器就不會快取該網頁。

舊式 http 1.0 伺服器不能使用 cache-control 標題。所以為了向後相容 http 1.0 伺服器,ie使用pragma:no-cache 標題對 http 提供特殊支援。

如果客戶端通過安全連線 (https://) 與伺服器通訊,且伺服器在響應中返回 pragma:no-cache 標題,則 internet explorer 不會快取此響應。

注意:pragma:no-cache 僅當在安全連線中使用時才防止快取,如果在非安全頁中使用,處理方式與 expires:-1 相同,該頁將被快取,但被標記為立即過期。

http-equiv meta標記:

在html頁面中可以用http-equiv meta來標記指定的http訊息頭部。老版本的ie可能不支援html meta標記,所以最好使用http訊息頭部來禁用快取。

範例三: 讓使用者的瀏覽器出現找不到檔案的資訊。

網上很多資料這樣寫:php的函式header()可以向瀏覽器傳送status標頭,

如 header(」status: 404 not found」)。

但是我發現實際上瀏覽器返回的響應卻是:

查了一些資料,正確的寫法是:

第一部分為http協議的版本(http-version);第二部分為狀態**(status);第三部分為原因短語(reason-phrase)。

範例四:header函式前輸入內容

一般來說在header函式前不能輸出html內容,類似的還有setcookie() 和 session 函式,這些函式需要在輸出流中增加訊息頭部資訊。如果在header()執行之前有echo等語句,當後面遇到header()時,就會報出 「warning: cannot modify header information - headers already sent by ….」錯誤。就是說在這些函式的前面不能有任何文字、空行、回車等,而且最好在header()函式後加上exit()函式。例如下面的錯誤寫法,在兩個 php**段之間有乙個空行:

//some code here

?>

//這裡應該是乙個空行

原因是:php指令碼開始執行 時,它可以同時傳送http訊息頭部(標題)資訊和主體資訊. http訊息頭部(來自 header() 或 setcookie() 函式)並不會立即傳送,相反,它被儲存到乙個列表中. 這樣就可以允許你修改標題資訊,包括預設的標題(例如 content-type 標題).但是,一旦指令碼傳送了任何非標題的輸出(例如,使用 html 或 print() 呼叫),那麼php就必須先傳送完所有的header,然後終止 http header.而後繼續傳送主體資料.從這時開始,任何新增或修改header資訊的試圖都是不允許的,並會傳送上述的錯誤訊息之一。

解決辦法:

修改php.ini開啟快取(output_buffering),或者在程式中使用快取函式ob_start(),ob_end_flush()等。原 理是:output_buffering被啟用時,在指令碼傳送輸出時,php並不傳送http header。相反,它將此輸出通過管道(pipe)輸入到動態增加的快取中(只能在php 4.0中使用,它具有**化的輸出機制)。你仍然可以修改/新增header,或者設定cookie,因為header實際上並沒有傳送。當全部指令碼終止 時,php將自動傳送http header到瀏覽器,然後再傳送輸出緩衝中的內容。

php header函式詳解

常用例項 200 正常狀態 301 永久重定向,記得在後面要加重定向位址 location url 重定向,其實就是302 暫時重定向 header location 設定頁面304 沒有修改 顯示登入框,header www authenticate basic realm 登入資訊 echo 顯...

php header函式詳解

說起 php 的header函式 肯定沒有人不知道,但是 如果 面試的時候讓你談談對header的認識 恐怕好多人都要抓瞎啦。下面咱們就來詳細聊聊 php的這個header 首先呢 自然 要從手冊說起了,一 手冊 header 傳送原生 http 頭 replace可選引數replace表明是否用後...

php header 函式詳解

一 作用 php只是以http協議將html文件的標頭送到瀏覽器,告訴瀏覽器具體怎麼處理這個頁面,至於傳送的內容則需要熟悉一下http協議了,與php無關了,可參照 傳統的標頭一定包含下面三種標頭之一,並只能出現一次。location x yyyy zzzz content type x yyyy ...