1 首部字段分类
1.1 HTTP/1.1 首部字段根据实际用途被分为以下4种类型
通用首部字段
(General Header Fields)- 请求报文和响应报文两方都会使用的首部
请求首部字段
(Request Header Fields)- 从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。
响应首部字段
(Response Header Fields)- 从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加的内容信息。
实体首部字段
(Entity Header Fields)- 针对请求报文和响应报文的实体部分(body部分)使用的首部。补充了资源内容更新时间等于实体有关的信息。
对 HTTP 报文的解析和处理其实本质上就是对头字段的处理,HTTP 的连接管理,缓存控制,内容协商等都是通过头字段来处理的,理解了头字段,基本上也就理解了 HTTP,所以理解头字段非常重要。
1.2 非 HTTP/1.1 首部字段
在 HTTP 协议通信交互中使用到的首部字段,不限于RFC2616 中定义的47种首部字段。还有Cookie、Set-Cookie 和 Content-Disposition等在其他 RFC 中定义的首部字段,它们的使用频率也很高。
这些非正式的首部字段同一归纳在RFC4299 HTTP Header Field Registrations中。
1.3 End-to-end 首部和 Hop-by-hop 首部
HTTP 首部字段将定义成缓存代理和非缓存代理的行为,分成2种类型。
端到端首部
(End-to-end Header),- 分在此类别中的首部会转发给请求/响应对应的最终接收目标,且必须保存在有缓存生成的响应中,另外规定它必须被转发。
逐跳首部
(Hop-by-hop Header)- 分在此类别种的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1 和之后版本中,如果使用hop-by-hop 首部,需提供Connection 首部字段。
下面列举了 HTTP/1.1 中的逐跳首部字段。除这8个首部字段之外,其他所有字段都属于端到端首部
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
2 通用首部字段
通用首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部 ,连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Transfer-Encoding | 逐跳首部 ,指定报文主体的传输编码方式 |
Upgrade | 逐跳首部 ,升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
2.1 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) |
2.1.1 表示是否能缓存的指令
2.1.1.1 public 指令
缓存响应指令
Cache-Control: public
当使用public指令时,则明确表明其他用户也可利用缓存。
2.1.1.2 private 指令
缓存响应指令
2.1.1.3 no-cache 指令
缓存请求指令、缓存响应指令
2.1.2 控制可执行缓存的对象的指令
2.1.2.1 no-store 指令
缓存请求指令、缓存响应指令
2.1.2.2 s-maxage 指令
缓存响应指令
2.1.2.3 max-age 指令
缓存请求指令、缓存响应指令
2.1.2.4 min-fresh 指令
缓存请求指令
2.1.2.5 max-stale 指令
缓存请求指令
Cache-Control: max-stale=3600 (单位:秒)
2.1.2.6 only-if-cached 指令
缓存请求指令
2.1.2.7must-revalidate 指令
缓存响应指令
2.1.2.8 proxy-revalidate 指令
缓存响应指令
Cache-Control: proxy-revalidate
proxy-revalidate 指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。
2.1.2.9 no-transform 指令
缓存请求指令、缓存响应指令
Cache-Control: no-transform
使用no-transform 指令规定无论是在请求还是响应种,缓存都不能改变实体主体的媒体类型。
这样做可防止缓存或代理压缩图片等类似操作。
2.1.3 Cache-Control 扩展
2.1.3.1 cache-extension token
缓存请求指令、缓存响应指令
2.2 Connection
逐跳首部字段
Connection 首部字段具备如下两个作用:
- 控制不再转发给代理的首部字段
- 管理持久连接
2.2.1 控制不再转发给代理的首部字段
2.2.2 管理持久连接
2.3 Date
2.4 Pragma
2.5 Trailer
逐跳首部字段
2.6 Transfer-Encoding
逐跳首部字段
补充: Transfer-Encoding 与 Content-Encoding 的区别
Transfer-Encoding
Transfer-Encoding 消息首部指明了将 entity 安全传递给用户所采用的编码形式。
Transfer-Encoding 是一个逐跳传输消息首部,即仅应用于两个节点之间的消息传递,而不是所请求的资源本身。一个多节点连接中的每一段都可以应用不同的Transfer-Encoding 值。如果你想要将压缩后的数据应用于整个连接,那么请使用端到端传输消息首部 Content-Encoding 。
Transfer-Encoding为chunked时,表示使用的分块传输编码。在数据的开头会使用16进制的数字表示数据长度,当数字为0的时候表示数据发送完毕。数据长度后面跟随CRLF(\r\n),数据的结尾也跟随着CRLF(\r\n)。
HTTP/1.1 200 OK\r\n
Content-Encoding: gzip\r\n
Content-Type: text/xml\r\n
Transfer-Encoding: chunked\r\n
Connection: keep-alive\r\n
\r\n
7\r\n
abcdefg\r\n
0\r\n
\r\n
Content-Encoding
Content-Encoding 是一个实体消息首部,用于对特定媒体类型的数据进行压缩。当这个首部出现的时候,它的值表示消息主体进行了何种方式的内容编码转换。这个消息首部用来告知客户端应该怎样解码才能获取在 Content-Type 中标示的媒体类型内容。
一般建议对数据尽可能地进行压缩,因此才有了这个消息首部的出现。不过对于特定类型的文件来说,比如jpeg图片文件,已经是进行过压缩的了。有时候再次进行额外的压缩无助于负载体积的减小,反而有可能会使其增大。
2.7 Upgrade
逐跳首部字段
2.8 Via
2.9 Warning
3 请求首部字段
请求首部字段名 | 说明 |
---|---|
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客户端程序的信息 |
3.1 Accept
3.2 Accept-Charset
3.3 Accept-Encoding
3.4 Accept-Language
3.5 Authorization
3.6 Expect
3.7 From
3.8 Host
3.9 If-Match
3.10 If-Modified-Since
3.11 If-None-Match
3.12 If-Range
3.13 If-Unmodified-Since
3.14 Max-Forwards
3.15 Proxy-Authorization
逐跳首部字段
3.16 Range
3.17 Referer
3.18 TE
逐跳首部字段
3.19 User-Agent
4 响应首部字段
响应首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定URI |
Proxy-Authenticate | 逐跳字段 ,代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理夫区其缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
4.1 Accept-Ranges
4.2 Age
4.3 ETag
4.4 Location
4.5 Proxy-Authenticate
逐跳首部字段
4.6 Retry-After
4.7 Server
4.8 Vary
4.9 WWW-Authenticate
5 实体首部字段
实体首部字段名 | 说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主题的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
5.1 Allow
5.2 Content-Encoding
5.3 Content-Language
5.4 Content-Length
5.5 Content-Location
5.6 Content-MD5
5.7 Content-Range
5.8 Content-Type
5.9 Expires
5.10 Last-Modified
6 非 HTTP首部字段
6.1 为Cookie服务的首部字段
首部字段名 | 说明 | 首部类型 |
---|---|---|
Set-Cookie | 开始状态管理所使用的Cookie信息 | 响应首部字段 |
Cookie | 服务器接收到的Cookie信息 | 请求首部字段 |
6.1.1 Set-Cookie
Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31 GMT; path=/; domain=.hackr.jp;
当服务器准备开始管理客户端的状态时,会事先告知各种信息。
Set-Cookie 字段的属性
属性 | 说明 |
---|---|
NAME=VALUE | 赋予Cookie的名称和其值(必需项) |
expires=DATE | Cookie的有效期(若不明确指定则默认为浏览器关闭前为止) |
path=PATH | 将服务器省的文件目录作为Cookie的使用对象(若不能指定则默认为文档所在的文件目录) |
domain=域名 | 作为Cookie适用对象的域名(若不指定则默认为创建Cookie的服务器的域名) |
secure | 仅在;HTTPS安全通信时才会发送Cookie |
HttpOnly | 加以限制,使Cookie不能被JavaScript脚本访问 |
6.1.1.1 expires 属性
6.1.1.2 path 属性
6.1.1.3 domain 属性
6.1.1.4 secure 属性
6.1.1.5 HttpOnly 属性
6.1.2 Cookie
Cookie: status=enable
首部字段Cookie会告知服务器,当客户端像获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie。接收到多个Cookie时,同样可以以多个Cookie形式发送。
6.2 其他首部字段
HTTP首部字段是可以自行扩展的。所以在Web服务器和浏览器的应用上,会出现各种非标准的首部字段。
接下来,我们就一些最为常用的首部字段进行说明。
- X-Frame-Options
- X-XSS-Protection
- DNT
- P3P
6.2.1 X-Frame-Options
6.2.2 X-XSS-Protection
6.2.3 DNT
6.2.4 P3P
[图片源于《图解HTTP》]