HTTP 协议的请求和响应报文中必定包含 HTTP 首部(也称头部)。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。对于客户端来说,这些信息中的大部分内容都无须亲自查看。

HTTP 报文首部

HTTP 请求报文

image.png
在请求中,HTTP 报文由方法、URI、HTTP 版本、HTTP 首部字段等部分构成

HTTP 响应报文

image.png
在响应中,HTTP 报文由 HTTP 版本、状态码、HTTP 首部字段 3 部分构成。

HTTP 首部字段

HTTP 首部字段传递重要信息

HTTP 首部字段是构成 HTTP 报文的主要要素。在客户端与服务器之间以 HTTP 协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。

使用首部字段是为来给浏览器和服务器提供报文主体、所使用的语言、认证信息等内容。

image.png

HTTP 首部字段结构

HTTP 首部字段是由首部字段名和字段值构成的,中间用“:”分隔。

  1. Content-Type: text/html

字段值对应单个 HTTP 首部字段可以有多个值。

Keep-Alive: timeout=15, max=100

4 种 HTTP 首部字段类型

HTTP 首部字段根据实际用途被分为 4 种类型

通用首部字段

请求报文和响应报文两方都会使用的首部。

首部字段名 说明
Cache-Control 控制缓存的行为
Connection 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知

请求首部字段

从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。

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

响应首部字段

从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容、也会要求客户端附加额外的内容信息。

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

实体首部字段

针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。

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

HTTP/1.1 通用首部字段

Cache-Control

通过指定首部字段 Cache-Control 的指令,就能操作缓存的工作机制。
image.png
指令是的参数是可选的,多个指令之间通过“,”分隔。首部字段 Cache-Control 的指令可用于请求及响应时。

Cache-Control: private, max-age=0, no-cache

Cache-Control 指令一览

缓存请求指令
指令 参数 说明
no-cache 强制向资源服务器再次验证
no-store 不缓存请求或响应的任何内容
max-age=[秒] 必需 响应的最大 Age 值
max-stale(= [秒]) 可省略 接收已过期的响应
min-fresh=[秒] 必需 期望在指定时间内容的响应仍有效
no-transform 代理不可更改媒体类型
only-if-cached 从缓存获取资源
cache-extension - 新指令标记(token)
缓存响应指令
指令 参数 说明
public 可向任意方提供响应的缓存
private 可省略 仅向特定用户返回响应
no-cache 可省略 缓存前必须先确认其有效性
no-store 不缓存请求或响应的任何内容
no-transform 代理不可更改媒体类型
must-revalidate 可缓存但必须再向源服务器确认
proxy-revalidate 要求中间缓存服务器对缓存的 响应有效性再进行确认
max-age=[秒] 必需 响应的最大 Age 值
s-maxage=[秒] 必需 公共缓存服务器响应的最大 Age 值
cache-extension - 新指令标记(token)

Connection

控制不再转发给代理的首部字段

image.png
在客户端发送请求和服务器返回响应内,使用 Connection 首部字段,可控制不再转发给代理的首部字段。

管理持久连接

HTTP/1.1 版本的默认连接都是持久连接,HTTP/1.1 之前的版本的默认连接都是非持久连接,在旧版本的 HTTP 协议上维持持续连接则必需指定 Connection 首部字段的值为 Keep-Alive。当服务器想明确断开连接时,则指定 Connection 首部字段值为 Close
image.png

请求首部字段

Accept

Accept 字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。若想要给显示的媒体类型增加优先级,则使用 q= 来额外表示权重值,用分号进行分隔。权重值 q 的范围是 0~1(精确到小数点后 3 位),默认权重为 q=1.0。

  • 文本文件:text/html,text/plain,text/css,appliaction/xhtml+xml,application/json
  • 图片文件:image/jpeg,image/gif,image/png
  • 视频文件:video/mpeg,video/quicktime
  • 应用程序使用的二进制文件:application/octet-stream,application/zip

image.png

Accept-Charset

Accept-Charset 字段可用来通知服务器用户代理支持的字符集及字符集的相对优先程序,支持指定多种字符集,也支持权重值 q 来表示相对优先级。
image.png

Accept-Encoding

Accept-Encoding 字段用来告知用户代理支持的内容编码及内容编码的优先级顺序,支持指定多种内容编码,也支持权重值 q 来表示相对优先级。可以使用星号(*)作为通配符,指定任意的编码格式。

  • gzip
  • compress
  • deflate
  • identity

image.png

Accept-Language

Accept-Language 字段用来告知服务器用户代理能够处理的自然语言集,支持指定多种自然语言集,也支持权重值 q 来表示相对优先级。
image.png

Authorization

Authorization 字段用来告知服务器,用户代理的认证信息。未通过服务器认证会接收到服务器响应 401 状态码。
image.png

Host

Host 字段告知服务器,请求的资源所处的互联网主机名和端口号。Host 字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段。当请求被发送至服务器时,请求中的主机名会用 IP 地址直接替换解决。但如果相同的 IP 地址下部署运行着多个域名,那么服务器就无法理解究竟是哪个域名对应的请求。因此,就需要使用首部字段 Host 来明确指出请求的主机名。若服务器未设定主机名,那直接发送一个空值即可。

Host: www.taobao.com

If-xxx

形如 If-xxx 这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断条件为真,才会执行请求。

If-Match

只有当 If-Match 的字段值跟 ETag 值匹配一致时,服务器才会接受请求。它会告知服务器匹配资源所用的实体标记(ETag)值。

If-Modified-Since

如果在 If-Modified-Since 字段指定的日期时间后,资源发生来更新,服务器才会接受请求。它会告知服务器若 If-Modified-Since 字段值早于资源的更新时间,则希望能处理该请求。而在指定 If-Modified-Since 字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码 304 Not Modified 的响应。

If-None-Match

只有在 If-None-Match 的字段值与 ETag 值不一致时,可处理该请求。与 If-Match 字段的作用相反。

If-Range

If-Range 字段告知服务器若指定的 If-Range 字段值和请求资源的 ETag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。

If-Unmodified-Since

它与 If-Modified-Since 的作用相反。

Max-Forwards

通过 TRACE 方法或者 OPTIONS 方法,发生包含首部字段 Max-Forwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目,服务器在往下一个服务器转发请求之前,会将 Max-Forwards 的值减 1 后重新赋值。当服务器接收到 Max-Forwards 值为 0 的请求时,则不再进行转发,而是直接返回响应。
image.png

Range

对于只需获取部分资源的范围请求,包含首部字段 Range 即可告知服务器资源的指定范围。

Referer

Referer 字段会告知服务器请求的原始资源的 URI。客户端一般都会发送 Referer 首部字段给服务器。

User-Agent

User-Agent 字段会将创建请求的浏览器和用户代理名称等信息传达给服务器。由网络爬虫发起请求时,有可能会在字段内添加爬虫作者的电子邮件地址。此外,如果请求经过代理,那么中间有可能被添加上服务器的名称。

响应首部字段

响应首部字段是由服务器向客户端返回响应报文中所使用的字段,用户补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。

Accept-Ranges

Accept-Ranges 字段告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。可指定的字段值有两种,可处理范围请求时指定其为 bytes,反之则指定其为 none。

Age

Age 字段告知客户端,源服务器在多久前创建来响应。字段值的单位为秒。

Retry-After

Retry-After 字段告知客户端应该在多久之后再次发送请求。主要配合状态码 503 Service Unavailable 响应,或 3XX Redirect 响应一起使用。

Server

Server 字段告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息,包含服务器上的软件应用名称、版本号和安装时启用的可选项

WWW-Authenticate

WWW-Authenticate 字段用于 HTTP 访问认证,它会告知客户端适用于访问请求 URI 所指定资源的认证方案和带参数提升的质询。一般使用在状态码 401 Unauthorized 响应中

实体首部字段

实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息

Allow

Allow 字段用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。当服务器接收到不支持的 HTTP 方法时,会以状态码 405 Method Not Allowed 作为响应返回。

Content-xxx

  • Content-Encoding:声明实体的主体部分选用的内容编码方式。一般使用 gzip
  • Content-Language:声明实体主体使用的自然语言
  • Content-Length:声明实体主体部分的大小(单位是字节)。当对实体主体进行内容编码传输时,不能再使用该字段
  • Content-Location:声明报文主体返回资源对于的 URI
  • Content-MD5:声明实体报文主体部分的 MD5 哈希值
  • Content-Type:声明实体主体内对象的媒体类型

    Expires

    Expires 字段告知客户端响应资源失效的日期,在 Expires 字段值指定的时间之前,响应的副本会一直被保存。优先级低于 max-age 指令。

    Last-Modified

    Last-Modified 字段声明资源最后修改的时间。

    为 Cookie 服务的首部字段

    Cookie 的工作机制是用户识别及状态管理。Web 网站为了管理用户的状态会通过 Web 浏览器,把一些数据临时写入用户的计算机内,当用户访问该 Web 网站时,可通过通信方式取回之前存放的 Cookie。

    Set-Cookie

    Set-Cookie 在服务器准备开始管理客户端的状态时,会事先告知各种信息。该字段值属性如下

  • expires:声明浏览器可发送 Cookie 的有效期。当省略 expires 属性时,默认有效期仅限于维持浏览器会话时间段内

  • path:声明 Cookie 发送范围的文件目录
  • domain:声明指定域名可做到与结尾匹配一致。指定一级域名后,下属子级域名也都可以发送 Cookie
  • secure:声明仅在 HTTPS 安全连接时,才可以发送 Cookie
  • HttpOnly:声明 JavaScript 脚步无法获得 Cookie。主要防止跨站脚本攻击窃取 Cookie 信息

    一旦 Cookie 从服务器端发送至客户端,服务器端就不存在可以显式删除 Cookie 的方法。但可通过覆盖已过期的 Cookie,实现对客户端 Cookie 的实质性删除操作

Cookie

Cookie 字段告知服务器,客户端想获得 HTTP 状态管理支持。Cookie 会包含在请求中发送至服务器端