PHP中常用的head()函数
PHP中header()函数的使用
header()函数被用来发送自定义的HTTP报文
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');
二、页面跳转
header('Location: URL');
不仅把报文发送给浏览器,还将返回一个重定向(302)的状态码,除非状态码已经事先被设置了
header('Refresh: 10; url=http://www.abc.com');
等价于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();
}
八、禁止本地缓存
客户端从服务器请求数据经历如下基本步骤:
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
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: must-revalidate');
作用与no-cache相同,但更严格,强制意味更明显
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); 整合到一起写
九、指定传输内容过程中使用的压缩方式
header('Content-Encoding: gzip');
整个数据信息是在服务器端经过怎样的压缩处理,然后客户端会以怎么的压缩编码来反向处理,以得到原始的内容。即服务器端压缩、客户端解压缩所使用的压缩方式。
常见的可用值为:gzip,compress,deflate和identity