PHP中header()函数的使用
header()函数被用来发送自定义的 HTTP 报文,注意header()必须在任何实际输出之前调用,不管是普通的html标签,还是文件里面的空行,空格或者是PHP文件里的空行,空格等header()被调用都会出错。
一、返回一个自定义的状态码
header('HTTP/1.1 200 OK');
header('HTTP/1.1 404 Not Found');
header('HTTP/1.1 301 Moved Permanently');
header('HTTP/1.1 302 Moved Temporarily');
二、页面跳转Location和Refresh
1)Location不仅把报文发送给浏览器,而且还将返回给浏览器一个重定向(302)的状态码,除非状态码已经事先被设置了。
header('Location: URL');
2)header('Refresh: 10; url=http://www.abc.com');
print '页面将在10秒以后跳转';
等价于HTML标签中的<meta http-equiv="refresh" content="10;http://www.abc.com" />
三、用于指定文件的信息
header('Content-type:MIME类型'); //发送指定的文件MIME类型的头信息
header('Content-Type: text/html; charset=utf-8'); //指定文件的MIME类型并指定该文件的编码
header('Content-Disposition:attachement;filename=文件名称'); //指定文件的描述
header('Last-Modified: '.date('D, d M Y H:i:s', filemtime($fn)).' GMT'); //指定资源的最后修改时间
header('Content-Length:文件大小'); //指定文件的大小
四、设置响应文件的语言
header('Content-language: en'); //en为英文english,zh-cn为中文。
五、指定该文件使用的编程语言的名称和版本号
header('X-Powered-By: PHP/4.4.0');
六、指定数据传输方式
header('Transfer-Encoding:chunked'); //表示网络传输中,用怎样的方式传输数据。可以是分段传输(chunked),也可以不分段直接使用原数据一次性进行传输(trunked)。
如果存在transfer-encodig时,就不能再使用content-length了,因为transfer-encoding会通过额外的处理方式来改变数据的组织方式,会改变实际的数据长度,如果客户端仍按照原content-length来处理的话,则不会接收到完整的数据。
七、BASIC认证,简单的验证
header('WWW-Authenticate: Basic realm="提醒语句"');
header('HTTP/1.1 401 Unauthorized');
用于简单的有限的用户名密码组合的验证,多用于路由器和网页的简单验证,弹出提示框中的用户名密码会以BASE64加密方式加密,并把用户名和密码的原字符串保存到$_SERVER
['PHP_AUTH_USER']和$_SERVER['PHP_AUTH_PW']两个变量中。例如:
if(@$_SERVER['PHP_AUTH_USER'] != 'user' || @$_SERVER['PHP_AUTH_PW'] != 'pass'){
header('WWW-Authenticate: Basic realm="会员列表页面"');
header('HTTP/1.0 401 Unauthorized');
exit();
}else{echo "aaa";}
上例中只有在用户在弹出的提示框中输入正确的用户名和密码才会显示出下面的内容。
八、禁止本地缓存
客户端从服务器请求数据经历如下基本步骤:
1、如果请求命中本地缓存则从本地缓存中获取一个对应资源的"copy";
2、服务器转发请求,检查这个"copy"是否fresh(最新的),是则直接返回,否则继续向服务器转发请求。
3、服务器接收到请求,然后判断资源是否变更,是则返回新内容,否则返回304,未变更。
4、客户端更新本地缓存。
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); //指定缓存过期日期时间,但是客户端和服务器时间不同步会导致Expires的配置出现问题。
header('Cache-Control: max-age=0'); //指定的是从缓存文档被访问后的保留时间,时间为秒。
header('Cache-Control: no-cache'); //强制客户端跳过步骤2,每次请求都必须向服务器发送。
header('Cache-Control: no-store'); //缓存将不存储response,包括header和body。除每次请求都必发送到服务器外,响应代码均是200,且request并没有发送"If-Modified-Since"和"If-None-Match"头,这意味着缓存的确没有存储response。
header('Cache-Control: must-revalidate'); //作用与no-cache相同,但更严格,强制意味更明显,但这只是理论上的描述,只要请求的频率加快到一定程度,服务器就接收不到
请求。
If-Modified-Since是标准的HTTP请求头标签,在发送HTTP请求时,把浏览器端缓存页面的最后修改时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时
间进行比较。如果时间一致,那么返回HTTP状态码304(不返回文件内容),客户端接到之后,就直接把本地缓存文件显示到浏览器中。如果时间不一致,就返回HTTP状态码200和新
的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。
If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验
证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag。
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); 整合到一起写
九、指定传输内容过程中使用的压缩方式
header('Content-Encoding: max-age=0');
即整个数据信息是在数据器端经过怎样的压缩处理,然后客户端会以怎么的压缩编码来反向处理,以得到原始的内容。即服务器端压缩、客户端解压缩所使用的压缩方式。
可以参考的值为:gzip,compress,deflate和identity。
- 本文固定链接: https://www.qingheluo.com/phpzhongchangyongdeheadhanshu/
- 转载请注明: qingheluo 于 清河洛 发表