程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> header location重定向語句對頁面進行跳轉失敗

header location重定向語句對頁面進行跳轉失敗

編輯:關於PHP編程

     函數header作用: 

       頁面跳轉

    http頭信息
       頭信息的作用很多,最主要的有下面幾個:
    1、跳轉
       當浏覽器接受到頭信息中的 Location: xxxx 後,就會自動跳轉到 xxxx 指向的URL地址,這點有點類似用 js 寫跳轉。但是這個跳轉只有浏覽器知道,不管體內容裡有沒有東西,用戶都看不到。
       例:header("Location: http:///");

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

    3、附件
       不知道大家有沒有注意,有些時候在一些網站下載東西,點下載連接以後,結果浏覽器將這個附件當成網頁打開了,裡面顯示的都是亂碼,這個問題也和頭信息有關。有時候浏覽器根據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:
       重定向網頁
       <?php

          header("Location: http://www.example.com/");

          exit;

       ?>
    例2:
       強制用戶每次訪問這個頁面時獲取最新資料,而不是使用存在客戶端的緩存。
       <?php 

           //告訴浏覽器此頁面的過期時間(用格林威治時間表示),只要是已經過去的日期即可。 

           header("Expires:Mon,26 Jul 1970 05:00:00 GMT"); 

     

           //告訴浏覽器此頁面的最後更新日期(用格林威治時間表示)也就是當天,目的就是強迫浏覽器獲取最新資料 

           header("Last-Modified:".gmdate("D,d M Y H:i:s")."GMT"); 

     

           //告訴客戶端浏覽器不使用緩存 

           header("Cache-Control:    no-cache,    must-revalidate"); 

     

           //參數(與以前的服務器兼容),即兼容HTTP1.0協議 

           header("Pragma:    no-cache");

      ?>  
    例3:
       輸出狀態值到浏覽器,主要用於訪問權限控制
       <?php 

           header('HTTP/1.1 401 Unauthorized'); 

           header('status: 401 Unauthorized'); 

       ?>  
    例4:
       要限制一個用戶不能訪問該頁,則可設置狀態為404,如下所示,這樣浏覽器就顯示為即該頁不存在
       <?php 

           header('HTTP/1.1    404    Not Found'); 

           header("status:    404    Not Found"); //這種寫法錯誤

       ?>
    例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代碼段之間有一個空行:
    <?php

    //some code here

    ?>

    //這裡應該是一個空行

    <?php

        header("http/1.1 403 Forbidden");

        exit();

    ?>
    原因:
       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到浏覽器,然後再發送輸出緩沖中的內容。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved