header locations重定向語句對頁(yè)麵(miàn)進行跳(tiào)轉失敗的原因
函數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)頁
- <?php
- header("locations: http://www.chithemodel.com/");
- exit;
- ?>
例2:
強製(zhì)用(yòng)戶(hù)每次(cì)訪問這個頁麵時獲取最新資料,而(ér)不是使用(yòng)存在客戶端的緩存。
- <?php
- //告訴瀏覽器此頁麵的(de)過期時間(用格林威(wēi)治時間表示),隻(zhī)要是已(yǐ)經(jīng)過去的日期即可(kě)。
- header("Expires:Mon,26 Jul 1970 05:00:00 GMT");
- //告訴瀏覽器此頁麵(miàn)的(de)最後更新日期(用格林威治時間(jiān)表示)也(yě)就是當天,目的就是強迫瀏覽器獲取最新資料
- header("Last-Modified:".gmdate("D,d M Y H:i:s")."GMT");
- //告訴(sù)客戶端瀏覽器不使用緩存
- header("Cache-Control: no-cache, must-revalsidate");
- //參數(與以前的(de)服務(wù)器兼容),即兼容HTTP1.0協議
- header("Pragma: no-cache");
- ?>
例3:
輸(shū)出狀態值到瀏覽器,主要用於訪問權限控製
- <?php
- header('HTTP/1.1 401 Unauthorized');
- header('status: 401 Unauthorized');
- ?>
例4:
要限製一個用戶不能(néng)訪問該頁,則可設置(zhì)狀態為(wéi)404,如下所示,這樣瀏(liú)覽器就顯示(shì)為即該頁不(bú)存在
- <?php
- header('HTTP/1.1 404 Not Found');
- header("status: 404 Not Found"); //這種(zhǒng)寫法錯誤(wù)
- ?>
例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代碼段之間有一個空行:
- <?php
- //some code here
- ?>
- //這裏應(yīng)該是一個空行(háng)
- <?php
- header("http/1.1 403 Forbidden");
- exit();
- ?>
原因:
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