HTTP首部
不管是请求报文还是响应报文,都会包含首部信息。HTTP首部都是由字段名和字段值构成的,中间由英文冒号:
隔开。一个首部字段名可以对应多个字段值。
四种首部字段的类型:
- 通用首部字段:请求报文和响应报文都会是使用的首部。
- 请求首部字段:从客户端向服务器发送请求报文时使用的首部。补充了请求的附加内容,客户端信息,响应内容相关优先级等信息。
- 响应首部字段:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端添加额外的内容信息。
- 实体首部字段:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容的更新时间等于实体有关的信息。
通用首部字段
Cache-Control
缓存控制相关。示例:
Cache-Control: private,max-age=0,no-cache
表示针对特定用户每次都需要重新访问服务器资源。max-age
不为0,则在过期之前不会重复访问。
Connection
控制不再转发给代理;管理持久连接。
示例:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
该请求用于websocket协议。
再例如:
Connection: close
HTTP/1.1默认是长连接,如果想明确需要断开连接,指定首部字段Connection为close即可。对应的有Keep-Alive
。
Upgrade
用于检测HTTP协议及其他协议是否可以使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
示例:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade
使用Upgrade字段时,还必须额外指定:Connection: Upgrade
。
对于服务端来说,收到带有Upgrade字段的请求,可以用101 Switching Protocols
状态码作为响应返回。
Date
表名创建报文的时间。示例:
Date:Tue, 14 Mar 2017 14:18:34 GMT
Pragma
HTTP/1.1之前版本的遗留字段,只用于客户端的请求中。示例:
Pragma: no-cache
Trailer
记录了报文主体后还会有哪些首部字段。
Transfer-Encoding
规定传输报文主体时采用的编码方式。HTTP/1.1的传输编码方式仅对分块传输编码有效。示例:
Transfer-Encoding: chunked
Via
用于追踪客户端与服务端的请求和响应报文的传输路径。示例:
Via: cache11.l2nu17[0,200-0,H], cache7.l2nu17[0,0], kunlun6.cn36[0,304-0,H], kunlun4.cn36[0,0]
Warning
通常用于告知用户一些与缓存相关的警告信息。
请求首部字段
Accept
该字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。
若想要给显示的媒体类型增加优先级,则使用q=
来额外表示权重值,并用分号;
进行分割。当权重值的范围是0~1
(可精确到小数点后3位),且1
为最大值。另外,不指定权重q
值时,默认权重位1.0
。
示例:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
每个逗号分隔代表一个类型,text/html
、application/xhtml+xml
和image/webp
权重1.0;application/xml
权重0.9;其它的权重0.8。
Accept-Charset
该字段可用来通知服务器用户代理支持的字符串及字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字段Accept相同的是可用权重q值来表示相对优先级。
示例:
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
Accept-Encoding
该字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序,可一次性制定多种内容编码。示例:
Accept-Encoding: gzip, deflate, sdch
Accept-Language
该字段用来告知服务器用户代理能够处理的自然语言集。示例:
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Authorization
该字段用来告知服务器,用户代理的认证信息,即证书值。想要通过服务器认证的代理会在接收到返回的401状态码响应后,把首部字段Authorization加入请求中。示例:
Authorization: Basic YWRtaW46YWRtaW4=
示例这里的加密串是用户名和密码的base64加密字符串。
一次典型的访问场景是:
- 浏览器发送http请求(没有Authorization header);
- 服务器端返回401页面;
- 浏览器弹出认证对话框;
- 用户输入帐号密码,并点确认;
- 浏览器再次发出http请求(带着Authorization header);
- 服务器端认证通过,并返回页面;
- 浏览器显示页面。
使用HTTP Authorization
的场景不会用cookie,也就是说每次都会送帐号密码信息过去。然后我们都知道base64编码基本上等于明文。这削弱了安全。由于种种缺点,HTTP Authorization
现在用的并不多。不过在路由器等场合还是有应用的,原因是HTTP Authorization
最简单,使用起来几乎是零成本。
在你需要做访问控制,又不想拖上SSO、数据库之类的东西的时候,HTTP Authorization
不失为一个简洁的选项。
Expect
该字段是客户端用来告知服务器期望出现的某种特定行为。如服务器无法理解客户端的期望则会发生错误,返回状态码417。
From
该字段用来告知服务器使用用户代理的用户的电子邮件地址。目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。使用代理时应尽可能包含From首部字段。
Host
多个虚拟主机可运行在同一个IP上,因此需要使用Host首部字段加以区分。该字段用来告知服务器,请求的资源所处的互联网主机名和端口号。
示例:
GET / HTTP/1.1
Host: server.example.com
If-Match
形如If-xxx
的样式的请求首部字段,都可以称之为条件请求。服务器接受到附带条件的请求时,只有判断指定条件为真才会执行请求。
If-Match首部字段属于附带条件之一,它会告诉服务器匹配资源所用的实体标记(ETag)值。而这时的服务器无法使用弱ETag值。
If-Modified-Since
该字段用来告知服务器若If-Modified-Since字段值早于资源的更新时间,则希望能处理该请求。而在制定的字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码304。
示例:
If-Modified-Since: Fri, 15 Feb 2013 03:06:57 GMT
If-None-Match
该字段和If-Match字段作用相反。用于指定的字段值的实体标记ETag值与请求资源的ETag不同时,就告知服务器处理该请求。
If-Range
该字段告知服务器若制定的字段值(ETag值或者时间)和请求资源的ETag值或时间相一致,则作为范围请求处理。反之,返回全体资源。下面对比If-Range和If-Match的不同:
使用If-Range字段时,如果不一致时则忽略范围请求,返回全部资源。而实用If-Match字段时,如果不一致则需要再次进行请求处理。
If-Unmodified-Since
该字段和If-Modified-Since字段相反,它的作用是告知服务器,指定的请求资源只有在字段值哪指定的日期时间之后,未发生更新的情况下,才能处理请求。如果在指定日期时间后发生了更新,则返回状态码412。
Max-Forwards
通过TRACE方法或OPTIONS方法时,发送包含首部字段Max-Forwards的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。
Proxy-Authorization
接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息。认证行为发生在客户端与代理之间。客户端和服务器之间的认证,实用首部字段Authorization可起到相同作用。
Range
对于只需要获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的制定范围。
Referer
该字段告知服务器请求的原始资源的URI。客户端一般都会发送Referer首部字段給服务器。
但当直接在浏览器的地址栏输入URI,或出于安全的考虑时,也可以不发送该首部字段。因为原始资源的URI中的查询字符串可能含有ID和密码等保密信息,要是写进Referer转发給其他服务器,则有可能导致保密信息的泄露。
示例:
Referer: http://www.cnblogs.com/xuxiang/p/3407539.html
TE
该字段告知服务器客户端能够处理响应的传输编码方式和相对优先级。它和首部字段Accept-Encoding的功能相似,但是这是用于传输编码。
User-Agent
该字段会将创建请求的浏览器种类和用户代理名称等信息传达给服务器。由网络爬虫发起请求时,有可能会在字段内添加爬虫作者的电子邮件地址。此外,如果请求经过代理,那么中间也可能被添加上代理服务器的名称。
示例:
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
响应首部字段
Accept-Ranges
告知客户端服务器能否处理范围请求,以指定获取服务器的某部分资源可指定的字段值分2种:
- bytes:可处理范围请求
- none:不能处理范围请求
示例:
Accept-Ranges: bytes
Age
告知客户端源服务器创建响应多久了,单位s。若创建响应的是缓存服务器,该字段指缓存后响应再次发起认证到认证完成的时间值,此时,必须加上首部字段Age。
示例:
Age:12017054
ETag
告知客户端实体标识。
这是一种将资源以字符串形式做唯一标识的一种方式,服务器会为没份资源分配对应的ETag值。
另外,当资源更新时,ETag值也需要更新:
ETag: "82e22293907ce725faf67773957acd12"
强ETag值和弱ETag值
- 强ETag值:不论实体发生多么细微的变化,都会改变其值
ETag: "usagi-1234"
- 弱ETag值
只提示资源是否相同;只有资源发生了根本改变,产生差异才会改变ETag值,此时,会在字段值最开始处附加W/
ETag: W/"usagi-1234"
Location
将响应接受方引导至某个与请求URI位置不同的资源。基本上该字段都会配合3xx:Redirction的响应,提供重定向的URI。示例:
Location: http://www.usagidesign.jp/sample.html
Proxy-Authenticate
把代理服务器所要求的认证信息发给客户端,他的认证行为在客户端与代理间进行。示例:
Proxy-Authenticate: basic realm="Usagidesign Auth"
Retry-After
告知客户端在多久之后再次发送请求,主要配合状态码503 Service Unavailable响应,或者3XX Redirect响应一起使用。
字段值可以指定具体的日期时间(Wed, 04 Jul 2012 06: 34: 24 GMT等格式),也可以是创建响应后的秒数。
示例:
Retry-After: 120
Server
告知客户端当前服务器上安装的http服务器应用程序的信息。其中包含软件应用名称,甚至版本号和安装时的启动项。示例:
Server: Tengine
Vary
控制缓存。源服务器向代理传达关于本地缓存使用方法的命令。客户端收到从代理服务器收到的从源服务器返回的包含该字段指定项的响应之后,若再次进行缓存,仅对请求中含有相同字段的请求返回缓存。
示例:
Vary: Accept-Encoding
WWW-Authenticate
HTTP访问认证。告知客户端适用于访问请求URI所指定资源的认证方案和带参数提示的查询。
状态码401 Unauthorized响应中,肯定包含该字段。
实体首部字段
Allow
通知客户端能够支持的Request-URI指定资源的所有http方法。如果服务器接收到不支持的方法,会返回状态码405Method Not Allowed作为响应返回。示例:
Allow:GET, HEAD
Content-Encoding
告知客户端服务器对实体的主体部分的选用的内容编码方式。内容编码指在不丢失实体信息的前提下所进行的压缩。主要采用以下这四种内容编码方式:
- gizp
- conpress
- deflate
- identity
示例:
Content-Encoding: gizp
Content-Lanuage
告知客户端实体主体使用的自然语言(优先接收的语言)。示例:
Content-Lanuage: zh-CN
Content-Length
表明实体主体部分的大下(单位是字节)。若对实体主体进行编码传输,不能使用该字段。示例:
Content-Length: 15000
Content-Location
给出了与报文主体部分相对应的URI。与Location不同,该字段表示的是报文主体返回资源的URI。
示例:
Content-Location: http://www.baidu/com/index-miss.html
Content-MD5
由一串由MD5算法生成的值,其目的在于检查报文主体在传输中是否保持完整,以及确认传输到达。 示例:
Content-MD5: OFJKGKLDFUIGNG35565FGNHLDGNH==
Content-Range
告知客户端作为响应返回的实体的哪个部分符合范围请求,(单位:字节),表示当前发送部分及整个实体大小。示例:
Content-Range: bytes 5001-10000/10000
Expires
告知客户端资源失效的日期。如果首部字段存在Cache-Control有指定max-age指定时,会优先处理max-age指令。示例:
Expires: Wed, 04 Jul 2016 09:26:05 GMT
Last-Modified
指明资源的最终修改的时间。示例:
Last-Modified: Wed, 04 Jul 2016 09:26:05 GMT
Cookie相关首部字段
Cookie的工作机制是用户识别及状态管理。
实现原理:方便管理用户状态,通过web浏览器将一些数据临时写入用户的计算机内,当用户访问时可通过通信方式取回之前发送的Cookie。
Set-Cookie
expires
指定浏览器可发送Cookie的有效期。若不指定则默认为会话时间段内。一旦Cookie从服务端发送到客户端,服务器就不存在可显式删除Cookie的方法,但可通过覆盖已过期的Cookie,实现对客户端的实质性删除。path
用于限制指定Cookie发送范围的文件目录。domain
通过该属性指定的域名可做到与结尾匹配一致。secure
限制web界面仅在HTTPS安全连接时,才可以发送Cookie。发送Cookie时,指定属性的方法如下:
Set-Cookie: name=value; secure
- HttpCookie
Cookie的扩展功能,使JavaScript脚本无法获得Cookie。主要目的是为了防止跨站脚本攻击对Cookie的信息窃取。发送指定HttpOnly属性的方法如下:
Set-Cookie: name=value; HttpOnly
Cookie
告知服务器,客户端想获得http状态管理支持时,就会在请求中包含从服务器接收到的Cookie。接收多个时,同样可以以多个发送。示例:
Cookie: pgv_pvi=7481519104; Hm_lvt_cc17b07fc9529e3d80b4482c9ce09086=1461665113
其它首部字段
由于HTTP首部字段可以自行扩展,所以还有一些其他的非标准的首部字段。例如X-Frame-Options、X-XSS-Protection、DNT、P3P等等,这里就不一一介绍了。
参考
1、HTTP 教程 | 菜鸟教程
http://www.runoob.com/http/http-tutorial.html
2、php中header函数参数的Cache-control:private,no-cache,must-revalidate,max-age是使用方法! - 斯世轻尘 - 博客园
http://www.cnblogs.com/xuxiang/p/3407539.html
3、HTTP Authorization - \(firecat的代码足迹\) - 博客频道 - ****.NET
http://blog.****.net/libaineu2004/article/details/38384487
4、http协议(八)请求首部字段 - IMyalost - 博客园
http://www.cnblogs.com/imyalost/p/5726556.html
5、http协议(九)响应首部字段 - IMyalost - 博客园
http://www.cnblogs.com/imyalost/p/5737024.html