php header
header
(PHP 3, PHP 4, PHP 5)
header -- 發(fā)送一個(gè)原始 HTTP 標(biāo)頭說(shuō)明
void?header?( string string [, bool replace [, int http_response_code]] )header()?函數(shù)用來(lái)發(fā)送一個(gè)原始?HTTP?標(biāo)頭。有關(guān)?HTTP?標(biāo)頭的更多內(nèi)容見(jiàn)?HTTP/1.1 規(guī)范。
可選參數(shù)?replace?指明是替換掉前一條類(lèi)似的標(biāo)頭還是增加一條相同類(lèi)型的標(biāo)頭。默認(rèn)為替換,但如果將其設(shè)為?FALSE?則可以強(qiáng)制發(fā)送多個(gè)同類(lèi)標(biāo)頭。例如:
| <?php header('WWW-Authenticate: Negotiate'); header('WWW-Authenticate: NTLM',?false); ?> |
第二個(gè)可選參數(shù)?http_response_code?強(qiáng)制將 HTTP 響應(yīng)代碼設(shè)為指定值(此參數(shù)是 PHP 4.3.0 新加的)。
有兩種特殊的 header 調(diào)用。第一種是標(biāo)頭以字符串“HTTP/”(大小寫(xiě)不重要)開(kāi)頭的,可以用來(lái)確定要發(fā)送的 HTTP 狀態(tài)碼。例如,如果配置了 Apache 用 PHP 來(lái)處理找不到文件的錯(cuò)誤處理請(qǐng)求(使用?ErrorDocument?指令),需要確保腳本產(chǎn)生了正確的狀態(tài)碼。
| <?php header("HTTP/1.0 404 Not Found") ?> |
注:?HTTP 狀態(tài)碼標(biāo)頭行總是第一個(gè)被發(fā)送到客戶端,而并不管實(shí)際的?header()?調(diào)用是否是第一個(gè)。除非 HTTP 標(biāo)頭已經(jīng)發(fā)送出去,任何時(shí)候都可以通過(guò)用新的狀態(tài)行調(diào)用?header()?函數(shù)來(lái)覆蓋原先的。
第二種特殊情況是以“Location:”標(biāo)頭。它不只是把這個(gè)標(biāo)頭發(fā)送回瀏覽器,它還將一個(gè)?REDIRECT(302)狀態(tài)碼返回給瀏覽器,除非之前已經(jīng)發(fā)出了某個(gè)?3xx?狀態(tài)碼。
| <?php header("Location: http://www.example.com/");?/* 重定向?yàn)g覽器 */ /* 確保重定向后,后續(xù)代碼不會(huì)被執(zhí)行 */ exit; ?> |
注:?HTTP/1.1 標(biāo)準(zhǔn)需要一個(gè)絕對(duì)地址的?URI?做為?Location:?的參數(shù), 但有一些客戶端支持相對(duì) URI。通??梢允褂?$_SERVER['HTTP_HOST']、$_SERVER['PHP_SELF']?及?dirname()?函數(shù)來(lái)自己從相對(duì) URI 產(chǎn)生出絕對(duì) URI:
| <?php header("Location: http://".$_SERVER['HTTP_HOST']. rtrim(dirname($_SERVER['PHP_SELF']), '/\\')."/".$relative_url); ?> |
注:?即使啟用了?session.use_trans_sid,Session ID 也不會(huì)隨著 Location 頭信息被傳遞。必須手工用?SID?常量來(lái)傳遞。
PHP 腳本通常會(huì)產(chǎn)生一些動(dòng)態(tài)內(nèi)容,這些內(nèi)容必須不被瀏覽器或代理服務(wù)器緩存。很多代理服務(wù)器和瀏覽器都可以被下面的方法禁止緩存:
| <?php header("Cache-Control: no-cache, must-revalidate");?// HTTP/1.1 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");?// 過(guò)去的時(shí)間 ?> |
注:?可能會(huì)發(fā)現(xiàn)即使不輸出上面所有的代碼,網(wǎng)頁(yè)也沒(méi)有被緩沖。用戶有很多選項(xiàng)可以設(shè)置來(lái)改變?yōu)g覽器的默認(rèn)緩存行為。通過(guò)發(fā)送上述標(biāo)頭,應(yīng)該可以覆蓋任何可以導(dǎo)致腳本頁(yè)面被緩存的設(shè)置。
另外,當(dāng)使用了 session 時(shí),利用?session_cache_limiter()?函數(shù)和?session.cache_limiter?選項(xiàng)可以用來(lái)自動(dòng)產(chǎn)生正確的緩存相關(guān)標(biāo)頭。
要記住?header()?必須在任何實(shí)際輸出之前調(diào)用,不論是來(lái)自普通的 HTML 標(biāo)記,空行或者 PHP。有一個(gè)常見(jiàn)錯(cuò)誤就是在通過(guò)?include(),require()?或一些其它的文件存取類(lèi)函數(shù)讀取代碼時(shí),有一些空格或者空行在調(diào)用?header()?之前被發(fā)送了出去。同樣在一個(gè)單獨(dú)的 PHP/HTML 文件中這個(gè)錯(cuò)誤也很普遍。
| <html> <?php /* 這將產(chǎn)生一個(gè)錯(cuò)誤,因?yàn)樵谡{(diào) header() * 之前已經(jīng)輸出了東西 */ header('Location: http://www.example.com/'); ?> |
注:?自 PHP 4 起,可以通過(guò)一些輸出緩沖函數(shù)來(lái)解決這個(gè)問(wèn)題。代價(jià)是把所有向?yàn)g覽器的輸出都緩存在服務(wù)器,直到下命令發(fā)送它們??梢栽诖a中使用?ob_start()?及?ob_end_flush()?來(lái)實(shí)現(xiàn)這樣的功能,或者通過(guò)修改?php.ini?中的?output_buffering?配置選項(xiàng)來(lái)實(shí)現(xiàn),也可以通過(guò)修改服務(wù)器配置文件來(lái)實(shí)現(xiàn)。
如果想提示用戶保存所發(fā)送的數(shù)據(jù),例如一個(gè)生成的 PDF 文件,可以通過(guò)發(fā)送?Content-Disposition?標(biāo)頭提供推薦的文件名來(lái)強(qiáng)制瀏覽器彈出一個(gè)保存文件對(duì)話框。
| <?php // 這樣將會(huì)直接輸出一個(gè) PDF 文件 header('Content-type: application/pdf'); // 這樣做就會(huì)提示下載 PDF 文件 downloaded.pdf header('Content-Disposition: attachment; filename="downloaded.pdf"'); // 這是 original.pdf 的源文件 readfile('original.pdf'); ?> |
注:?Microsoft Internet Explorer 4.01 中的一個(gè)漏洞使得該機(jī)制無(wú)法正常工作,無(wú)解決方案。在 Microsoft Internet Explorer 5.5 中也有個(gè)漏洞影響到這一點(diǎn),升級(jí)到 Service Pack 2 或更高版本可以解決。
注:?在安全模式下,如果設(shè)定了?WWW-Authenticate?標(biāo)頭(用于 HTTP 認(rèn)證)則腳本的 UID 會(huì)添加到其中的?realm?部分中去。
---------------------------------------------------------------------------------------
<?php
// 服務(wù)器錯(cuò)誤
header('HTTP/1.1 500 Internal Server Error');
// 重定向到一個(gè)新的位置
header(‘Location: http://blog.iterse.com/’);
//用這個(gè)header指令來(lái)解決URL重寫(xiě)產(chǎn)生的404 header
header(‘HTTP/1.1 200 OK’);
// 頁(yè)面沒(méi)找到
header(‘HTTP/1.1 404 Not Found’);
// 訪問(wèn)受限
header(‘HTTP/1.1 403 Forbidden’);
// The page moved permanently should be used for
// all redrictions, because search engines know
// what’s going on and can easily update their urls.
//頁(yè)面被永久刪除,可以告訴搜索引擎更新它們的urls
header(‘HTTP/1.1 301 Moved Permanently’);
// 延遲一段時(shí)間后重定向; 也可以使用HTML語(yǔ)法來(lái)實(shí)現(xiàn)延遲
header(‘Refresh: 3; url=http://blog.iterse.com/’);
echo ‘You will be redirected in 3 seconds’;
// 加載要下載的文件:
header(‘Content-Transfer-Encoding: binary’);
readfile(‘example.zip’);
// 設(shè)置內(nèi)容類(lèi)型:
header(‘Content-Type: text/html; charset=iso-8859-1′);
header(‘Content-Type: text/html; charset=utf-8′);
header(‘Content-Type: text/plain’); // plain text file
header(‘Content-Type: image/jpeg’); // JPG picture
header(‘Content-Type: application/zip’); // ZIP file
header(‘Content-Type: application/pdf’); // PDF file
header(‘Content-Type: audio/mpeg’); // Audio MPEG (MP3,…) file
header(‘Content-Type: application/x-shockwave-flash’); // Flash animation
?>
-----------------------------------------------------------------------------
在PHP中用header("location:test.php")進(jìn)行跳轉(zhuǎn)要注意以下幾點(diǎn):
1、location和“:”號(hào)間不能有空格,否則會(huì)出錯(cuò)。
2、在用header前不能有任何的輸出。
3、header后的PHP代碼還會(huì)被執(zhí)行。
下面是和asp中重定向response.redirect的比較:
例1:
response.redirect "../test.asp"
header("location:../test.php");
兩者區(qū)別:
asp的redirect函數(shù)可以在向客戶發(fā)送頭文件后起作用.
如
<html><head></head><body>
<%response.redirect "../test.asp"%>
</body></html>
查是php中下例代碼會(huì)報(bào)錯(cuò):
<html><head></head><body>
<?
header("location:../test.php");
?>
</body></html>
只能這樣:
<?
header("location:../test.php");
?>
<html><head></head><body>...</body></html>
即header函數(shù)之前不能向客戶發(fā)送任何數(shù)據(jù).
例2:
asp中
<html><head></head><body>
<%
response.redirect "../a.asp"
response.redirect "../b.asp"
%>
</body></html>
結(jié)果是重定向a.asp文件.
php呢?
<?
header("location:../a.php");
header("location:../b.php");
?>
<html><head></head><body></body></html>
我們發(fā)現(xiàn)它重定向b.php.
原來(lái)在asp中執(zhí)行redirect后不會(huì)再執(zhí)行后面的代碼.
而php在執(zhí)行header后,繼續(xù)執(zhí)行下面的代碼.
在這方面上php中的header重定向不如asp中的重定向.有時(shí)我們要重定向后,不能執(zhí)行后面的代碼:
一般地我們用
if(...)
header("...");
else
{
...
}
但是我們可以簡(jiǎn)單的用下面的方法:
if(...)
{ header("...");exit();}
還要注意的是,如果是用Unicode(UTF-8)編碼時(shí)也會(huì)出現(xiàn)問(wèn)題,需要調(diào)整緩存設(shè)置.
?
轉(zhuǎn)載于:https://www.cnblogs.com/shuaixf/archive/2011/10/24/2222406.html
總結(jié)
以上是生活随笔為你收集整理的php header的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 无法识别设备怎么办 设备无法被识别怎么办
- 下一篇: php短信接口源码,比较简单,但也实用