在《认识 HTTP 报文》一文中介绍过一些 HTTP 首部字段的内容,HTTP 首部字段是 HTTP 报文的一个重要部分。在客户端和服务器的通信过程中,无论是请求还是相应都会使用 HTTP 首部字段来传递额外的信息。例如《认识 HTTP 中的内容协商机制》一文中就提到使用 Accept-Encoding 等首部字段进行内容协商,向服务器端获取压缩版本的响应数据。今天就具体来了解一下 HTTP 首部字段。

HTTP 首部字段的结构

HTTP 首部字段的结构由字段名和字段值组成,中间使用冒号“:”分隔开。

# 首部字段:字段值
Accept-Encoding:br, gzip;q=0.8

如以上示例,首部字段是 Accept-Encoding,字段值为 br, gzip;q=0.8。可以看到,字段值可以有多个值,

按 HTTP 协议规范来说,每个 HTTP 报文的首部字段应该是唯一的,如果出现两个或两个以上的重复首部字段,每个浏览器的表现可能会不一致,这个应为在 HTTP 协议的规范中没有明确定义这种情况应该如何处理。所以在实际的应用中,我们应该尽量保证首部字段的唯一性,以确保各个浏览器的表现一致。

HTTP 首部字段的类型

根据 HTTP 首部字段的用途,首部字段被分为 4 种类型:通用首部字段、请求首部字段、响应首部字段和实体(表示)首部字段。

通用首部字段(General Header Fields)

通用首部字段指的是请求首部字段和响应首部字段都会被使用到的首部字段。

  • Cache-Control:控制缓存的行为;
  • Connection:逐条首部,链接的管理;
  • Date:创建报文的日期时间;
  • Pragma:报文指令;
  • Trailer:报文末端的首部一览;
  • Transfer-Encoding:指定报文主体的传输编码方式;
  • Upgrae:升级为其它协议;
  • Via:代理服务器的相关信息;
  • Waming:错误通知;

请求首部字段(Request Header Fields)

请求首部字段是在客户端发送的请求报文中使用的首部字段。用来补充说明请求的附加内容、客户信息已经响应内容优先级等信息。

  • Accept:用户代理可处理的媒体类型;
  • Accept-Charset:优先的字符集;
  • Accept-Encoding:优先的内容编码;
  • Accept-Language:优先的(自然)语言;
  • Authorization:Web 认证信息;
  • Expect:期待服务器的特定行为;
  • Form:用户的电子邮箱地址;
  • Host:请求资源所在的服务器;
  • If-Match:比较实体标记(ETag);
  • If-Modified-Since:比较资源的更新时间;
  • If-None-Match:比较实体标记(与If-Match 相反 );
  • If-Range:资源未更新时发送实体 Byte 的范围;
  • If-Unmodified-Since:比较资源的更新时间;
  • Max-Forwards:最大传输逐跳数;
  • Proxy-Authorization:代理服务器要求客户端的认证信息;
  • Range:实体的字节范围请求;
  • Referer:对请求中的 URI 的原始获取方;
  • TE:传输编码的优先级;
  • User-Agent: HTTP 客户端程序的信息;

响应首部字段(Response Header Fields)

响应首部字段是从服务端返回的响应报文中使用的首部字段。也是用来补充响应的附加信息,并且还会要求客户端附加额外信息。

  • Accept-Ranges:是否接受字节范围请求;
  • Age:推算资源创建经过时间;
  • ETag:资源的匹配信息;
  • Location:客户端重定向至指定 URI;
  • Proxy-Authenticate:代理服务器对客户端的认证信息;
  • Retry-After:对再次发起请求的时机要求;
  • Server: HTTP 服务器的安装信息;
  • Vary:代理服务器缓存的管理信息;
  • WWW-Authenticate:服务器对客户端的认证信息;

实体首部字段(Entity Header Fields)

请求报文和响应报文表示实体内容部分的首部字段。补充了资源内容更新时间等与实体有关的附加信息。

  • Allow:资源可支持的 HTTP 方法;
  • Content-Encoding:实体主体适用的编码方式;
  • Content-Language:实体主体的自然语言;
  • Content-Length:实体主体的大小(单位:字节)
  • Content-Location:替代对应资源的 URI;
  • Content-MD5:实体主体的报文摘要;
  • Content-Range:实体主体的位置范围;
  • Content-Type:实体主体的媒体类型;
  • Expires:实体主体的过期日期时间;
  • Last-Modified:资源的最后修改日期时间;

非 HTTP/1.1 首部字段

除了 HTTP/1.1 协议中规定的 47 种首部字段之外,还有类似 Cookie 、Set-Cookie 和其它一些、使用频率很高的非 HTTP/1.1 首部字段、

这些非正式的首部字段都可以在 RFC4229 HTTP Header Fields Registrations 中,感兴趣的朋友可以去详细了解一下。

端到端首部和逐跳首部

HTTP 首部字段按缓存代理和非缓存代理的行为来分,可以分为 2 中类型:端到端首部、逐跳首部。

端到端首部(End-to-end Header)

端到端首部会转发请求/响应对应的最终接受信息,必须保存在由缓存的响应中,并规定它必须被转发。

逐跳首部(Hop-by-hop Header)

逐跳首部只对单次转发有效,会因为通过缓存或者代理而不再转发。这意味着在 HTTP/1.1 或者之后的版本中,如果使用逐跳首部,需要结合 Connection 首部字段使用。

以下为 HTTP/1.1 中所有 8 个逐跳首部:

  1. Connection
  2. Keep-Alive
  3. Proxy-Authenticate
  4. Proxy-Aruhoriztion
  5. Traller
  6. TE
  7. Transfer-Encoding
  8. Upgrade

其它所有的首部字段均属于端到端的首部字段。

分类: Blog