前面有几篇博文介绍了HTTP协议、HTTP请求方法详解、Javascript中Cookie的那些事儿、HTTPS,今天我们来聊一聊关于HTTP首部的那些事儿
HTTP协议的请求和响应报文中肯定包含HTTP首部,首部为服务器和客户端分别处理请求和响应提供所需要的信息。而请求报文和响应报文在结构上又惊人的相似。下面以百度为例,我们来看二者之间有什么不同:
请求报文示例:
GET / HTTP/1.1 Host: www.baidu.com Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2816.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8 Cookie: BIDUPSID=B1B714EF2E3D00D3499B04F5B4A65E24; BAIDUID=6AE2CCD65C9379FDDA3BF5EF8C6543BE:FG=1; PSTM=1461936802; BDUSS=ZPYmZBUFdZd3B4YTdFa01CbXdIUm1CNlVMZFZMcEFRMEJiR3dWZDRxamZYTnBYQVFBQUFBJCQAAAAAAAAAAAEAAACCmStVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN%7EPslffz7JXbz; H_PS_645EC=c5b77Gs2Dx4Ykavto%2Fo7JIb9zq21sqi9nUsFbwcZ%2FgO32YeRbaHyhCrPQXs8wpPFN8vl; BD_HOME=1; H_PS_PSSID=20048_1422_19036_18282_17947_21113_17001_21189_21161_20930; BD_UPN=12314353; sug=3; sugstore=0; ORIGIN=2; bdime=0
响应报文示例:
HTTP/1.1 200 OK Server: bfe/1.0.8.18 Date: Thu, 29 Sep 2016 16:43:31 GMT Content-Type: text/html;charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Cache-Control: private Expires: Thu, 29 Sep 2016 16:43:31 GMT Content-Encoding: gzip X-UA-Compatible: IE=Edge,chrome=1 Strict-Transport-Security: max-age=604800 BDPAGETYPE: 2 BDQID: 0x8703882800005c3f BDUSERID: 1428920706 Set-Cookie: BDSVRTM=70; path=/ Set-Cookie: BD_HOME=1; path=/ Set-Cookie: H_PS_PSSID=20048_1422_19036_18282_17947_21113_17001_21189_21161_20930; path=/; domain=.baidu.com Set-Cookie: __bsi=13807309971438994139_00_100_R_N_71_0303_C02F_N_I_I_0; expires=Thu, 29-Sep-16 16:43:36 GMT; domain=www.baidu.com; path=/
比较二者的区别:在响应报文的报文首部中,分别是响应首部字段、通用首部字段、实体首部字段,而在请求报文首部中,分别是请求首部字段、通用首部字段、实体首部字段。下面我们来依次介绍。
1.通用首部
有些首部时客户端和服务端都能使用,且提供了与报文相关的最基本信息,叫做通用首部。
通用信息首部
首部 | 描述 |
---|---|
Connection | 允许客户端和服务器指定与请求/响应连接有关的选项。 |
Date | 提供日期和时间标志,说明报文是什么时间创建的。 |
MIME-Version | 给出了发送短使用的 MINE 版本。 |
Trailer | 如果报文采用了分块传输编码(chunked transfer encoding)方式,就可以用这个首部列出位于报文拖挂(trailer)部分的首部集合。 |
Transfer-Encoding | 告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。 |
Update | 给出了发送端可能想要"升级"使用的新版本或协议。 |
Via | 显示报文经过的中间节点(代理、网关)。 |
通用缓存首部
首部 | 描述 |
---|---|
Cache-Control | 用于随报文传送缓存指示。控制缓存的行为。 |
Pragma | 另一种随报文传送指示的方式,当并不专用于缓存。 |
2.请求首部
请求首部是只在请求报文中有意义的首部。
请求的信息性首部
首部 | 描述 |
---|---|
Client-IP | 提供了运行客户端的机器的IP地址。 |
From | 提供了客户端用户的 Email 地址。(使用RFC 822 E-mail地址格式) |
Host | 给出了接受请求的服务器的主机名和端口号。 |
Referer | 提供了包含当前请求 URI 的文档的 URL。 |
UA-Color | 提供了与客户端显示器的现实颜色有关的信息。 |
UA-CPU | 提供了客户端 CPU 的类型和制造商。 |
UA-Disp | 提供了与客户端显示器能力有关的信息。 |
UA-OS | 给出了运行在客户端机器上的操作系统名称和版本。 |
UA-Pixels | 提供了客户端显示器的色素信息。 |
User-Agent | 将发起请求的应用程序名告知服务器。 |
Accept首部
Accept首部为客户端提供了一种将其喜好和能力告知服务器的方式。Accept首部会使连接的两端都受益。
首部 | 描述 |
---|---|
Accept | 告诉服务器能够发送哪些媒体类型。 |
Accept-Charset | 告诉服务器能够发送哪些字符集。 |
Accept-Encoding | 告诉服务器能够发送哪些编码方式。 |
Accept-Language | 告诉服务器能够发送哪些语言。 |
TE | 告诉服务器可以使用哪些扩咱传输编码。 |
条件请求首部
有时客户端希望为请求加上某些限制。比如,客户端已经有了一份文档副本,就希望只在服务器上的文档与客户端拥有的副本有区别时,才请求服务器传输文档。通过条件请求首部,客户端就可以为请求加上这种限制,要求服务器在对请求进行响应之前,确保某个条件为真。
首部 | 描述 |
---|---|
Expect | 允许客户端列出请求所要求的服务器行为。 |
If-Match | 如果实体标记与文档当前的实体标记相匹配,就获取这份文档。 |
If-Modified-Since | 除非在某个指定的日期之后资源被修改过,否则就限制这个请求。 |
If-None-Match | 如果提供的实体标记与当前文档的实体标记不相符,就获取文档。 |
If-Range | 允许对文档的某个范围进行条件请求。 |
If-Unmodified-Since | 除非在某个指定日期之后资源没有被修改过,否则限制这个请求。 |
Range | 如果服务器支持范围请求,就请求资源的指定范围。 |
安全请求首部
首部 | 描述 |
---|---|
Authorization | 包含了提供给服务器来对客户端进行自身认证的数据。 |
Cookie | 客户端用它向服务器传送一个令牌-----它并不是真正的安全首部,但却是隐含了安全功能。 |
Cookie2 | 用来说明请求端支持的cookie版本。 |
代理请求首部
首部 | 描述 |
---|---|
Max-Forward | 在通往源端服务器的路径上,将请求转发给其他代理或网管的最大次数----与 TRACE 方法一同使用。 |
Proxy-Authorization | 与 Authorization 首部相同,但这个首部是在于代理进行认证时使用的。 |
Proxy-Connection | 与 Connection 首部相同,但这个首部是在于代理建立连接时使用的。 |
3.响应首部
响应的信息性首部
首部 | 描述 |
---|---|
Age | (从最初创建开始)响应持续时间。 |
Public | 服务器为其资源支持的请求方法列表。 |
Retry-After | 如果资源不可用的话,在此日期或时间重试。 |
Server | 服务器应用程序软件的名称和版本。 |
Title | 对 HTML 文档来说,就是 HTML 文档的源端给出的标题。 |
Warning | 比原因短语更详细一些的警告报文。 |
协商首部
首部 | 描述 |
---|---|
Accept-Ranges | 对此资源来说,服务器可接受的范围类型。 |
Vary | 服务器查看的其他首部列表,可能会使响应发生变化;也就是说,这是一个首部列表,服务器会根据这些首部的内容挑选出最适合的资源版本发送给客户端。 |
安全响应首部
首部 | 描述 |
---|---|
Proxy-Authenticate | 来自代理的对客户端的质询列表。 |
Set-Cookie | 不是真正的安全首部,但隐含安全功能;可以在客户端设置一个令牌,以便服务器对其客户端进行标识。 |
Set-Cookie2 | 与 Set-Cookie 类似,PFC 2965 Cookie定义。 |
WWW-Authenticate | 来自服务器对客户端的质询列表。 |
4.实体首部
实体首部提供了有关实体及其内容的大量信息,请求和响应报文中都可能包含实体部分,所以这两类报文都可能出现这些首部。总之,实体首部可以告知报文的接收者它在对什么进行处理。
实体的信息性首部
首部 | 描述 |
---|---|
Allow | 列出可以对此事提执行的请求方法。 |
Location | 告知客户端实际上位于何处;用于将接收端定向到资源的(可能是新的)位置(URL)上去。 |
内容首部
内容首部提供了与实体内容有关的特定信息,说明了其类型,尺寸以及处理它所需要的其它有用信息。
首部 | 描述 |
---|---|
Content-Base | 解释主体中的相对 URL 时使用的基础 URL |
Content-Encoding | 对主体执行的任意编码方式。 |
Content-Language | 理解主体时最适宜使用的自然语言。 |
Content-Length | 主体的长度或尺寸。 |
Content-Locaton | 资源实际所处的位置。 |
Content-MD5 | 主体的 MD5 校验和。 |
Content-Range | 在整个资源中此实体表示的字节范围。 |
Content-Type | 在这个主体的对象类型。 |
实体缓存首部
通用的缓存首部说明了如何或者什么时候进行缓存。实体的缓存首部提供了与被缓存实体有关的信息。
首部 | 描述 |
---|---|
ETag | 与此实体相关的实体标记。 |
Expires | 实体不再有效,要从原始的源端再次获取此实体的日期和时间。 |
Last-Modified | 这个实体最后一次被修改的日期和时间。 |
【相关文章】
1、HTTP协议:http://www.cnblogs.com/foodoir/p/5905946.html
2、HTTP请求方法详解:http://www.cnblogs.com/foodoir/p/5911099.html
3、Javascript中关于Cookie的那些事儿:http://www.cnblogs.com/foodoir/p/5914631.html