關於header的那些事——header location重定向語句對頁面進行跳轉失敗的緣由

函數header做用:  
   頁面跳轉

http頭信息
   頭信息的做用不少,最主要的有下面幾個:
一、跳轉
   當瀏覽器接受到頭信息中的 Location: xxxx 後,就會自動跳轉到 xxxx 指向的URL地址,這點有點相似用 js 寫跳轉。可是這個跳轉只有瀏覽器知道,無論體內容裏有沒有東西,用戶都看不到。
   例:header("Location: http://www.xker.com/");

二、指定網頁的內容
   一樣一個XML文件,若是頭信息中指定:Content-type: application/xml 的話,瀏覽器會將其按照XML文件格式解析。可是,若是頭信息中是:Content-type: text/xml 的話,瀏覽器就會將其看做存文本解析。(瀏覽器不是按照擴展名解析文件的)
   例:header('Content-type: application/pdf');

三、附件
   不知道你們有沒有注意,有些時候在一些網站下載東西,點下載鏈接之後,結果瀏覽器將這個附件當成網頁打開了,裏面顯示的都是亂碼,這個問題也和頭信息有關。有時候瀏覽器根據Content-type 來判斷是打開仍是保存,這樣有時就會判斷錯誤(主要是網站設計者忘記寫Content-type)。其實,還有一個能夠來指定該內容爲附件、須要保存,這個就是:Content-Disposition: attachment; filename="xxxxx"
   例:header('Content-Disposition: attachment; filename="downloaded.pdf"');
      //打開文件,並輸出
      readfile('original.pdf');

HTTP協議狀態碼 
1××  保留  
2××  表示請求成功地接收  
3××  爲完成請求客戶需進一步細化請求  
4××  客戶錯誤  
5××  服務器錯誤  

語法:
   header(string,replace,http_response_code)
參數
   string:必需。規定要發送的報頭字符串。
   replace:可選。指示該報頭是否替換以前的報頭,或添加第二個報頭。默認是 true(替換)。false(容許相同類型的多個報頭)。
   http_response_code:可選。把 HTTP 響應代碼強制爲指定的值。(PHP 4 以及更高版本可用)

例1:
   重定向網頁
  1.    <?php 
  2.       header("Location: http://www.example.com/");
  3.       exit;
  4.    ?>
例2:
   強制用戶每次訪問這個頁面時獲取最新資料,而不是使用存在客戶端的緩存。
  1.    <?php  
  2.        //告訴瀏覽器此頁面的過時時間(用格林威治時間表示),只要是已通過去的日期便可。  
  3.        header("Expires:Mon,26 Jul 1970 05:00:00 GMT");  

  4.        //告訴瀏覽器此頁面的最後更新日期(用格林威治時間表示)也就是當天,目的就是強迫瀏覽器獲取最新資料  
  5.        header("Last-Modified:".gmdate("D,d M Y H:i:s")."GMT");  

  6.        //告訴客戶端瀏覽器不使用緩存  
  7.        header("Cache-Control:    no-cache,    must-revalidate");  

  8.        //參數(與之前的服務器兼容),即兼容HTTP1.0協議  
  9.        header("Pragma:    no-cache"); 
  10.   ?>  
例3:
   輸出狀態值到瀏覽器,主要用於訪問權限控制
  1.    <?php  
  2.        header('HTTP/1.1 401 Unauthorized');  
  3.        header('status: 401 Unauthorized');  
  4.    ?>  
例4:
   要限制一個用戶不能訪問該頁,則可設置狀態爲404,以下所示,這樣瀏覽器就顯示爲即該頁不存在
  1.    <?php  
  2.        header('HTTP/1.1    404    Not Found');  
  3.        header("status:    404    Not Found"); //這種寫法錯誤
  4.    ?>
例5:
   隱藏文件的位置
   html標籤 <A href='http://hostname/*.mp3'></a>就能夠實現普通文件下載。若是爲了保密文件,就不能把文件連接告訴別人,能夠用header函數實現文件下載。
  header("Content-type: audio/mpeg");
   header("Content-Disposition: attachment; filename=filenale");
   header("Content-Description: PHP3 Generated Data");
例6:
   header函數前輸入內容

    通常來講在header函數前不能輸出html內容,相似的還有setcookie() 和 session 函數,這些函數須要在輸出流中增長消息頭部信息。若是在header()執行以前有echo等語句,當後面遇到header()時,就會報出 「Warning: Cannot modify header information - headers already sent by ....」錯誤。就是說在這些函數的前面不能有任何文字、空行、回車等,並且最好在header()函數後加上exit()函數。例以下面的錯誤寫法,在兩個php代碼段之間有一個空行:
  1. <?php
  2. //some code here
  3. ?>
  4. //這裏應該是一個空行
  5. <?php
  6.     header("http/1.1 403 Forbidden");
  7.     exit();
  8. ?>
緣由:
   PHP腳本開始執行 時,它能夠同時發送http消息頭部(標題)信息和主體信息. http消息頭部(來自 header() 或SetCookie() 函數)並不會當即發送,相反,它被保存到一個列表中. 這樣就能夠容許你修改標題信息,包括缺省的標題(例如Content-Type 標題).可是,一旦腳本發送了任何非標題的輸出(例如,使用 HTML 或 print()調用),那麼PHP就必須先發送完全部的Header,而後終止 HTTPheader.然後繼續發送主體數據.從這時開始,任何添加或修改Header信息的試圖都是不容許的,並會發送上述的錯誤消息之一。

解決辦法:
修改php.ini打開緩存(output_buffering), 將output_buffering=0修改爲output_buffering=4096
或者在程序中使用緩存函數ob_start(),ob_end_flush() 等。原理是:output_buffering被啓用時,在腳本發送輸出時,PHP並不發送HTTPheader。相反,它將此輸出經過管道(pipe)輸入到動態增長的緩存中(只能在PHP4.0中使用,它具備中央化的輸出機制)。你仍然能夠修改/添加header,或者設置cookie,由於 header實際上並無發送。當所有腳本終止時,PHP將自動發送HTTP header到瀏覽器,而後再發送輸出緩衝中的內容。
相關文章
相關標籤/搜索