1、什么是 HTTP 请求头/响应头
- 请求头
当你使用http(https)协议请求一个网站的时候,你的浏览器会向对方的服务器发送一个http请求,这个请求同样包含三个部分
- 请求方法 请求路径(URL) 请求协议版本
- 报文主体
- (POST/GET)参数
这里是一个请求头的示例
这些讯息里面包含了你的请求方法,你请求的目的地,你的语言,以及你的浏览器的各种信息,这样对方的服务器就能靠着辨识这些讯息来辨识你的浏览器
2. 响应头
当你向对方发送请求后,对方会回应你浏览器的请求,返回两个部分:响应头,Body
- 注:Body就是返回给你的主体,比如说请求网站返回的html
响应头讯息里包含了服务器的响应讯息,如http版本,压缩方式,响应文件类型,文件编码等
响应头示例
2、HTTP 请求头/响应头的详细介绍
请求头
Accept: text/html,p_w_picpath/* 浏览器通过这个头,告诉服务器它所支持的数据类型 Accept-Charset: 浏览器通过这个头,告诉服务器它采用的字符集 Accept-Encoding:浏览器通过这个头,告诉服务器,它所支持的压缩格式 Accept-Language:浏览器通过这个头,告诉服务器,它所采用的语言 Host:浏览器通过这个头,告诉服务器,我想访问服务器哪台主机 If-Modified-Since:浏览器通过这个头,告诉服务器,它缓存数据时间是多少。 Referer:浏览器通过这个头,告诉服务器,我是从哪个网页点过来的(防盗链) User-Agent: 浏览器通过这个头,告诉服务器,当前浏览器操作系统的信息,以及浏览器的版本号 Connection : 表示是否需要持久连接。如果web服务器端看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点, web服务器需要在返回给客户端HTTP头信息中发送一个Content-Length(返回信息正文的长度)头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然 后在正式写出内容之前计算它的大小。 Connec-Length : 请求头的长度。 Connect-Type : 显示此HTTP请求提交的内容类型。一般只有post提交时才需要设置该属性。 有关Content-Type属性值可以如下两种编码类型: 1. “application/x-www-form-urlencoded”: 表单数据向服务器提交时所采用的编码类型,默认的缺省值就是“application/x-www-form-urlencoded”。 然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。 2. “multipart/form-data”: 在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。 当提交为单单数据时,可以使用“application/x-www-form-urlencoded”;当提交的是文件时,就需要使用“multipart/form-data”编码类型。 在Content-Type属性当中还是指定提交内容的charset字符编码。一般不进行设置,它只是告诉web服务器post提交的数据采用的何种字符编码。 cookie : 浏览器端cookie。 Hose : 客户端地址 Origin : 目标地址 x-Requested-With : 是否为同步请求 ,如果为XMLHttpRequest,则为 Ajax 异步请求。如果为null则为传统同步请求
响应头
Location:这个头通常配合302状态码使用,它用于告诉浏览器你去找谁。 Server:告诉浏览器,服务器的类型 Content-Encoding: 服务器通过这个头,告诉浏览器,回送的数据采用的压缩格式。 Content-Length: 80 Content-Language: zh-cn Content-Type:这个头用于告诉浏览器,回送数据的类型 Last-Modified:这个头用于告诉浏览器,数据的最后修改时间 Refresh: :这个头用于控制浏览器定时刷新 Content-Disposition: 用于通知浏览器,以下载方式打开回送的数据 Transfer-Encoding: 用于通知浏览器,数据是以分块形式回送的 ETag: 缓存相头的头 Expires: 用于说明网页的失效时间,如果该值为一个<0的值,则服务器是通知浏览器不要缓存 Cache-Control: no-cache 通知浏览器不要缓存 Refresh: 1;url=http://www.it315.org 隔多少秒以后,让当前页面去访问哪个地址(例如网页登陆成功后,跳回原来的界面,就是用的这个头) Content-Disposition: attachment;filename=aaa.zip 和下载相关,通知浏览器以附件的形式下载服务器发送过去的数据 Transfer-Encoding: chunked 数据传输模式 Set-Cookie:SS=Q0=5Lb_nQ; path=/search 和cookie相关的头 ETag: W/"83794-1208174400000" 和cookie相关的头 Expires: -1 通知浏览器是否缓存当前资源:如果这个头的值是一个以毫秒为单位值,则通知浏览器缓存资源到指定的时间点;如果值是0或-1,则通知浏览器禁止缓存 Cache-Control: no-cache 通知浏览器是否缓存资源 Pragma: no-cache -- 通知浏览器是否缓存资源 Connection: close/Keep-Alive 是否继续保持连接 Date: Tue, 11 Jul 2000 18:23:51 GMT 当前响应的时间
参考:http://tools.jb51.net/table/http_header
3、HTTP请求头/响应头可以拿来干什么
能干的事情很多,下面就简单列出几个
- 声明你的文件类型,使用的文件编码
- 提交POST参数(没错,POST的参数在Header里面)
- 识别用户使用的语言,以显示不同的页面
- 通过UA判断用户在使用什么浏览器打开你的网站,比如qq,微信等自带浏览器都通过UA判断出来
拓展
1.http响应报文里的 Via 和 X-cache 有什么区别?
via是http协议里面的一个header,记录了一次http请求所经过的代理和网关,经过1个代理服务器,就添加一个代理服务器的信息,经过2个就添加2个。
x-cache是squid代理的自定义header,用来记录缓存的命中与否(Squid 是 Linux/Unix 平台下最为流行的高性能免费应用层代理服务器)