HTTP 首部字段根据实际用途被分为以下 4 种类型。
通用首部字段(General Header Fields)请求报文和响应报文两方都会使用的首部。
请求首部字段(Request Header Fields)从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。
响应首部字段(Response Header Fields)从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
实体首部字段(Entity Header Fields)针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。
通用首部字段
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 资源的最后修改日期时间
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)
public:
Cache-Control: public
当指定使用 public 指令时,则明确表明其他用户也可利用缓存。
private:
当指定 private 指令后,响应只以特定的用户作为对象,这与 public指令的行为相反。缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。
no-cache
Cache-Control: no-cache使用 no-cache 指令的目的是为了防止从缓存中返回过期的资源。客户端发送的请求中如果包含 no-cache 指令,则表示客户端将不会接收缓存过的响应。于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。如果服务器返回的响应中包含 no-cache 指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。
Cache-Control: no-cache=Location
由服务器返回的响应中,若报文首部字段 Cache-Control 中对 no-cache
字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首
部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首
部字段可以使用缓存。只能在响应指令中指定该参数。
Cache-Control: no-store
当使用 no-store 指令 1 时,暗示请求(和对应的响应)或响应中包含
机密信息。
从字面意思上很容易把 no-cache 误解成为不缓存,但事实上 no-cache 代表不缓
存过期的资源,缓存会向源服务器进行有效期确认后处理资源,也许称为 do-notserve-from-cache-without-revalidation
更合适。no-store 才是真正地不进行缓存,
因此,该指令规定缓存不能在本地存储请求或响应的任一部分。
Cache-Control: s-maxage=604800(单位 :秒)s-maxage 指令的功能和 max-age 指令的相同,它们的不同点是 smaxage
指令只适用于供多位用户使用的公共缓存服务器 2。也就是
说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何
作用。
另外,当使用 s-maxage 指令后,则直接忽略对 Expires 首部字段及
max-age 指令的处理。
Cache-Control: max-age=604800(单位:秒)
当客户端发送的请求中包含 max-age 指令时,如果判定缓存资源的缓
存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。
另外,当指定 max-age 值为 0,那么缓存服务器通常需要将请求转发
给源服务器。
当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源
的有效性再作确认,而 max-age 数值代表资源保存为缓存的最长时
间。
应用 HTTP/1.1 版本的缓存服务器遇到同时存在 Expires 首部字段的情
况时,会优先处理 max-age 指令,而忽略掉 Expires 首部字段。而
HTTP/1.0 版本的缓存服务器的情况却相反,max-age 指令会被忽略
89
掉。
Cache-Control: min-fresh=60(单位:秒)
min-fresh 指令要求缓存服务器返回至少还未过指定时间的缓存资源。
比如,当指定 min-fresh 为 60 秒后,过了 60 秒的资源都无法作为响
应返回了。
Cache-Control: max-stale=3600(单位:秒)
使用 max-stale 可指示缓存资源,即使过期也照常接收。
如果指令未指定参数值,那么无论经过多久,客户端都会接收响应;
如果指令中指定了具体数值,那么即使过期,只要仍处于 max-stale
指定的时间内,仍旧会被客户端接收。
Cache-Control: only-if-cached
使用 only-if-cached 指令表示客户端仅在缓存服务器本地缓存目标资
源的情况下才会要求其返回。换言之,该指令要求缓存服务器不重新
加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本
地缓存无响应,则返回状态码 504 Gateway Timeout。
Connection: Keep-Alive
我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
Pragma: no-cache
该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户
端会要求所有的中间服务器不返回缓存的资源。
所有的中间服务器如果都能以 HTTP/1.1 为基准,那直接采用 CacheControl:
no-cache 指定缓存的处理方式是最为理想的。但要整体掌握
全部中间服务器使用的 HTTP 协议版本却是不现实的。因此,发送的
请求会同时含有下面两个首部字段。Cache-Control: no-cache Pragma: no-cache
Trailer
首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。该
首部字段可应用在 HTTP/1.1 版本分块传输编码时。
Transfer-Encoding
首部字段 Transfer-Encoding 规定了传输报文主体时采用的编码方式。
Upgrade
首部字段 Upgrade 用于检测 HTTP 协议及其他协议是否可使用更高的
版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
Via
使用首部字段 Via 是为了追踪客户端与服务器之间的请求和响应报文
的传输路径。
Warning
HTTP/1.1 的 Warning 首部是从 HTTP/1.0 的响应首部(Retry-After)演
变过来的。该首部通常会告知用户一些与缓存相关的问题的警告。
HTTP/1.1 警告码
警告码 警告内容 说明
110 Response is stale(响应已过期) 代理返回已过期的资源
111 Revalidation failed(再验证失败)代理再验证资源有效性时失败(服务器无法到达等原因)
112 Disconnection operation(断开连接操作)代理与互联网连接被故意切断
113 Heuristic expiration(试探性过期)响应的使用期超过24小时(有效缓存的设定时间大于24小时的情况下)
199 Miscellaneous warning(杂项警告) 任意的警告内容
214 Transformation applied(使用了转换)代理对内容编码或媒体类型等执行了某些处理时
299Miscellaneous persistent warning(持久杂项警告)任意的警告内容
Accept: text/html,application/xhtml+xml,application/xml;Accept 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体
类型的相对优先级。
Accept-Charset
Accept-Charset 首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。
Accept-Encoding: gzip, deflate
Accept-Encoding 首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。
下面试举出几个内容编码的例子。
gzip
由文件压缩程序 gzip(GNU zip)生成的编码格式(RFC1952),采用 Lempel-Ziv 算法(LZ77)及 32 位循环冗余校验(Cyclic Redundancy Check,通称 CRC)。
compress
由 UNIX 文件压缩程序 compress 生成的编码格式,采用 LempelZiv-Welch算法(LZW)。
deflate
组合使用 zlib 格式(RFC1950)及由 deflate 压缩算法(RFC1951)生成的编码格式。
identity
不执行压缩或不会变化的默认编码格式
Accept-Language
Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3
首部字段 Accept-Language 用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次
指定多种自然语言集。
Authorization
首部字段 Authorization 是用来告知服务器,用户代理的认证信息(证
书值)。通常,想要通过服务器认证的用户代理会在接收到返回的
401 状态码响应后,把首部字段 Authorization 加入请求中。共用缓存
在接收到含有 Authorization 首部字段的请求时的操作处理会略有差
异。
Host
首部字段 Host 会告知服务器,请求的资源所处的互联网主机名和端
口号。Host 首部字段在 HTTP/1.1 规范内是唯一一个必须被包含在请
求内的首部字段。
首部字段 Host 和以单台服务器分配多个域名的虚拟主机的工作机制
有很密切的关联,这是首部字段 Host 必须存在的意义。
If-Match
形如 If-xxx 这种样式的请求首部字段,都可称为条件请求。服务器接
收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
If-Modified-Since
如果在 If-Modified-Since 字段指定的日期时间后,资源发生了
更新,服务器会接受请求
If-Range
首部字段 If-Range 属于附带条件之一。它告知服务器若指定的 IfRange
字段值(ETag 值或者时间)和请求资源的 ETag 值或时间相一
致时,则作为范围请求处理。反之,则返回全体资源。
Range
对于只需获取部分资源的范围请求,包含首部字段 Range 即可告知服
务器资源的指定范围。上面的示例表示请求获取从第 5001 字节至第
10000 字节的资源。
接收到附带 Range 首部字段请求的服务器,会在处理请求之后返回状
态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返
回状态码 200 OK 的响应及全部资源。
Referer
Referer: http://www.hackr.jp/index.htm
首部字段 Referer 会告知服务器请求的原始资源的 URI。
客户端一般都会发送 Referer 首部字段给服务器。但当直接在浏览器
的地址栏输入 URI,或出于安全性的考虑时,也可以不发送该首部字
段。
因为原始资源的 URI 中的查询字符串可能含有 ID 和密码等保密信
息,要是写进 Referer 转发给其他服务器,则有可能导致保密信息的
泄露。
Accept-Ranges
首部字段 Accept-Ranges 是用来告知客户端服务器是否能处理范围请
求,以指定获取服务器端某个部分的资源。
可指定的字段值有两种,可处理范围请求时指定其为 bytes,反之则
指定其为 none。
Age: 600
首部字段 Age 能告知客户端,源服务器在多久前创建了响应。字段值
的单位为秒。
若创建该响应的服务器是缓存服务器,Age 值是指缓存后的响应再次
发起认证到认证完成的时间值。代理创建响应时必须加上首部字段
Age。
Expires
首部字段 Expires 会将资源失效的日期告知客户端。缓存服务器在接
收到含有首部字段 Expires 的响应后,会以缓存来应答请求,在
Expires 字段值指定的时间之前,响应的副本会一直被保存。当超过
指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求
资源。
源服务器不希望缓存服务器对资源缓存时,最好在 Expires 字段内写
入与首部字段 Date 相同的时间值。
但是,当首部字段 Cache-Control 有指定 max-age 指令时,比起首部字
段 Expires,会优先处理 max-age 指令。
Last-Modified
Last-Modified: Wed, 23 May 2012 09:59:55 GMT
首部字段 Last-Modified 指明资源最终修改的时间。一般来说,这个
值就是 Request-URI 指定资源被修改的时间。但类似使用 CGI 脚本进
行动态数据处理时,该值有可能会变成数据最终修改时的时间。