HTTP 协议的请求和响应报文中必定包含 HTTP 首部(也称头部)。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。对于客户端来说,这些信息中的大部分内容都无须亲自查看。
HTTP 报文首部
HTTP 请求报文
在请求中,HTTP 报文由方法、URI、HTTP 版本、HTTP 首部字段等部分构成
HTTP 响应报文
在响应中,HTTP 报文由 HTTP 版本、状态码、HTTP 首部字段 3 部分构成。
HTTP 首部字段
HTTP 首部字段传递重要信息
HTTP 首部字段是构成 HTTP 报文的主要要素。在客户端与服务器之间以 HTTP 协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。
使用首部字段是为来给浏览器和服务器提供报文主体、所使用的语言、认证信息等内容。
HTTP 首部字段结构
HTTP 首部字段是由首部字段名和字段值构成的,中间用“:”分隔。
Content-Type: text/html
字段值对应单个 HTTP 首部字段可以有多个值。
Keep-Alive: timeout=15, max=100
4 种 HTTP 首部字段类型
通用首部字段
请求报文和响应报文两方都会使用的首部。
首部字段名 | 说明 |
---|---|
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 的指令,就能操作缓存的工作机制。
指令是的参数是可选的,多个指令之间通过“,”分隔。首部字段 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
控制不再转发给代理的首部字段
在客户端发送请求和服务器返回响应内,使用 Connection 首部字段,可控制不再转发给代理的首部字段。
管理持久连接
HTTP/1.1 版本的默认连接都是持久连接,HTTP/1.1 之前的版本的默认连接都是非持久连接,在旧版本的 HTTP 协议上维持持续连接则必需指定 Connection 首部字段的值为 Keep-Alive。当服务器想明确断开连接时,则指定 Connection 首部字段值为 Close
请求首部字段
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
Accept-Charset
Accept-Charset 字段可用来通知服务器用户代理支持的字符集及字符集的相对优先程序,支持指定多种字符集,也支持权重值 q 来表示相对优先级。
Accept-Encoding
Accept-Encoding 字段用来告知用户代理支持的内容编码及内容编码的优先级顺序,支持指定多种内容编码,也支持权重值 q 来表示相对优先级。可以使用星号(*)作为通配符,指定任意的编码格式。
- gzip
- compress
- deflate
- identity
Accept-Language
Accept-Language 字段用来告知服务器用户代理能够处理的自然语言集,支持指定多种自然语言集,也支持权重值 q 来表示相对优先级。
Authorization
Authorization 字段用来告知服务器,用户代理的认证信息。未通过服务器认证会接收到服务器响应 401 状态码。
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
Max-Forwards
通过 TRACE 方法或者 OPTIONS 方法,发生包含首部字段 Max-Forwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目,服务器在往下一个服务器转发请求之前,会将 Max-Forwards 的值减 1 后重新赋值。当服务器接收到 Max-Forwards 值为 0 的请求时,则不再进行转发,而是直接返回响应。
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 哈希值
-
Expires
Expires 字段告知客户端响应资源失效的日期,在 Expires 字段值指定的时间之前,响应的副本会一直被保存。优先级低于 max-age 指令。
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 会包含在请求中发送至服务器端