綠色(sè)資源網:您身邊最放心(xīn)的安全(quán)下載站! 最新(xīn)軟件(jiàn)|熱(rè)門排行|軟件分(fèn)類|軟件專題|廠商大全

綠色資源網

技術(shù)教程
您的位置:首(shǒu)頁網絡編程PHP編(biān)程 → header locations重定向語句對頁(yè)麵進行跳轉失敗(bài)的(de)原因

header locations重定向語句對頁(yè)麵(miàn)進行跳(tiào)轉失敗的原因

我要評論 2011/03/10 19:34:51 來源:綠色資(zī)源網 編輯:綠色資(zī)源(yuán)站 [ ] 評(píng)論:0 點擊:571次

函數header作用:  
   頁(yè)麵跳轉(zhuǎn)

http頭信息
   頭信息(xī)的作(zuò)用很多(duō),最主要的(de)有下麵幾(jǐ)個:
1、跳轉
   當瀏覽器接(jiē)受到頭信息中的(de) locations: xxxx 後,就(jiù)會(huì)自動跳轉(zhuǎn)到 xxxx 指向(xiàng)的URL地址,這點有點類似用 js 寫跳轉。但是這個跳轉隻有瀏覽器知道,不管體內容裏有沒有東西(xī),用戶(hù)都看不(bú)到。
   例:header("locations: http://www.chithemodel.com/");

2、指定網(wǎng)頁的內容(róng)
   同樣一個XML文件(jiàn),如果頭信息中(zhōng)指定:Content-type: application/xml 的話(huà),瀏覽器會將(jiāng)其(qí)按照XML文件格(gé)式解析(xī)。但是,如果頭信(xìn)息中是:Content-type: text/xml 的話,瀏覽器就會將(jiāng)其看作存文(wén)本解析。(瀏覽器不是按照(zhào)擴展名解析文件的)
   例:header('Content-type: application/pdf');

3、附件
   不知道(dào)大家有沒有注意,有些(xiē)時候(hòu)在一些網站下載(zǎi)東西,點下載(zǎi)連接以後,結果(guǒ)瀏覽器將這個附件當成(chéng)網(wǎng)頁打開了,裏麵顯示的都是亂碼,這個(gè)問題(tí)也和頭(tóu)信息(xī)有關(guān)。有時(shí)候瀏覽器(qì)根據(jù)Content-type 來判(pàn)斷是打開還是保(bǎo)存,這(zhè)樣有時(shí)就會(huì)判斷錯(cuò)誤(主要(yào)是網(wǎng)站設(shè)計者忘記寫Content-type)。其實,還有一個可(kě)以來(lái)指定該內容為附件、需要(yào)保存(cún),這個就(jiù)是:Content-Disposition: attachment; filename="xxxxx"
   例(lì):header('Content-Disposition: attachment; filename="downloaded.pdf"');
      //打開文件,並輸出
      readfile('original.pdf');

HTTP協議狀態碼
1××  保留  
2××  表示請求成功地接收  
3××  為完(wán)成請求客戶需(xū)進一(yī)步細化(huà)請求  
4××  客戶錯誤  
5××  服(fú)務器錯誤(wù)  

語法(fǎ):
   header(string,replace,http_response_code)
參數
   string:必需。規定要發(fā)送的報頭字(zì)符串。
   replace:可選。指(zhǐ)示該(gāi)報頭是否替換之前的報頭,或添加第(dì)二個報頭。默(mò)認(rèn)是(shì) true(替換)。false(允許相同(tóng)類型的多個(gè)報頭)。
   http_response_code:可選。把 HTTP 響應代(dài)碼強製為指定的值(zhí)。(PHP 4 以(yǐ)及更高版(bǎn)本可用(yòng))

例1:
   重定向(xiàng)網(wǎng)頁

  1.    <?php
     
  2.       header("locations: http://www.chithemodel.com/");
     
  3.       exit;
     
  4.    ?>

例2:
   強製(zhì)用(yòng)戶(hù)每次(cì)訪問這個頁麵時獲取最新資料,而(ér)不是使用(yòng)存在客戶端的緩存。

  1.    <?php  
     
  2.        //告訴瀏覽器此頁麵的(de)過期時間(用格林威(wēi)治時間表示),隻(zhī)要是已(yǐ)經(jīng)過去的日期即可(kě)。  
     
  3.        header("Expires:Mon,26 Jul 1970 05:00:00 GMT");  
     

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

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

  10.  
  11.        //參數(與以前的(de)服務(wù)器兼容),即兼容HTTP1.0協議  
     
  12.        header("Pragma:    no-cache");
     
  13.   ?>  

例3:
   輸(shū)出狀態值到瀏覽器,主要用於訪問權限控製

  1.    <?php  
     
  2.        header('HTTP/1.1 401 Unauthorized');  
     
  3.        header('status: 401 Unauthorized');  
     
  4.    ?>  

例4:
   要限製一個用戶不能(néng)訪問該頁,則可設置(zhì)狀態為(wéi)404,如下所示,這樣瀏(liú)覽器就顯示(shì)為即該頁不(bú)存在

  1.    <?php  
     
  2.        header('HTTP/1.1    404    Not Found');  
     
  3.        header("status:    404    Not Found"); //這種(zhǒng)寫法錯誤(wù)
     
  4.    ?>

例5:
   隱藏文件的(de)位置
   html標簽 <A rel='nofollow' href='http://hostname/*.mp3'></a>就可以實現普通文件下(xià)載。如(rú)果為了保密文件,就不能(néng)把文件鏈接告訴別人,可以用(yòng)header函數實(shí)現文件(jiàn)下載。

  header("Content-type: audio/mpeg");
   header("Content-Disposition: attachment; filename=filenale");
   header("Content-Description: PHP3 Generated Data");

例(lì)6:
   header函(hán)數前輸入內(nèi)容

    一般來說在header函數前不能輸出html內容,類似的還(hái)有(yǒu)setcookie() 和(hé) session 函數,這些函數需要在輸出流中增加消息頭部信息。如果在header()執行之前有(yǒu)echo等語句,當(dāng)後麵遇到header()時,就會(huì)報(bào)出(chū) “Warning: Cannot modify header information - headers already sent by ....”錯誤。就是說在這些函(hán)數的(de)前(qián)麵(miàn)不能有任何文字、空行、回車等,而且(qiě)最好在header()函(hán)數後加上exit()函數。例如下麵的錯(cuò)誤(wù)寫法,在(zài)兩個(gè)php代碼段之間有一個空行:

  1. <?php
     
  2. //some code here
     
  3. ?>
     
  4. //這裏應(yīng)該是一個空行(háng)
     
  5. <?php
     
  6.     header("http/1.1 403 Forbidden");
     
  7.     exit();
     
  8. ?>

原因:
   PHP腳本(běn)開始執行(háng) 時,它可以(yǐ)同時發送http消息頭(tóu)部(標題)信息和主體信(xìn)息. http消息(xī)頭部(來自 header() 或SetCookie() 函數)並不(bú)會立(lì)即發送(sòng),相反,它被保存(cún)到一個列(liè)表中. 這樣就可以允許你修改標題信息(xī),包括缺省(shěng)的標題(例如Content-Type 標題).但是,一旦腳本(běn)發送了任何非標題(tí)的輸出(例如(rú),使用(yòng) HTML 或 print()調用(yòng)),那(nà)麽PHP就必須先(xiān)發送完所有的Header,然後終止 HTTPheader.而後繼(jì)續發送主體數據.從這時開始,任何添(tiān)加或(huò)修改(gǎi)Header信息的試圖都是不允許的,並(bìng)會發送上述(shù)的(de)錯誤(wù)消息(xī)之(zhī)一。

解決辦(bàn)法:
修改php.ini打開(kāi)緩存(cún)(output_buffering),將output_buffering=0修改(gǎi)成output_buffering=4096
或者在程序中使用緩存函(hán)數ob_start(),ob_end_flush() 等。原理是:output_buffering被啟用時,在腳(jiǎo)本發送輸出時,PHP並不發送HTTPheader。相反,它將此輸出通過管道(pipe)輸(shū)入到(dào)動(dòng)態增加(jiā)的緩存(cún)中(隻能在PHP4.0中使用(yòng),它具有中央(yāng)化的輸出機製(zhì))。你仍然可以修改/添加(jiā)header,或者設置(zhì)cookie,因為 header實際(jì)上並沒有(yǒu)發送。當(dāng)全部腳(jiǎo)本終止(zhǐ)時,PHP將自動發送HTTP header到(dào)瀏覽器,然後再發送輸出(chū)緩衝中的內容。

關(guān)鍵詞:header,locations,重定向語句

閱讀本文後您(nín)有什麽感想? 已有 人給(gěi)出評(píng)價!

  • 11 歡迎喜歡
  • 419 白癡
  • 428 拜托
  • 100 哇
  • 336 加油
  • 300 鄙視