图解HTTP解析6(通用首部)
一、通用首部字段
通用首部字段是指, 请求报文和响应报文双方都会使用的首部。
1. Cache-Control(★)
指定该字段可以控制缓存的行为。
该指令参数是可选的,多个之间用,
隔开,如:
Cache-Control: private, max-age=0, no-cache
1.1 缓存请求指令
-
no-cache :
Cache-Control: no-cache
,在请求中带上该首部字段,则表示客户端将不会接收缓存过的响应。将该请求转发给源服务器(要求中间服务器强制向源服务器发起验证),注意:该指令是指不缓存过期资源 -
no-store :
Cache-Control: no-store
,暗示请求(和对应的响应) 或响应中包含机密信息,no-store
才是真正地不进行缓存,该指令规定缓存不能在本地存储请求或响应的任一部分。 -
max-age:
Cache-Control: max-age=604800(单位 : 秒)
,服务器中会对缓存的资源记录它的缓存时间,当请求含有该字段指令时,代表当资源缓存时间小于指令指定时间,则接收缓存资源,否则,向源服务器发起验证请求。当把max-age=0
时,则表示直接发送给源服务器。 -
s-maxage:
Cache-Control: s-maxage=604800(单位 : 秒)
,该指令作用与max-age
一样,但只用于共享缓存(比如 CDN 缓存)。 -
min-fresh:
Cache-Control: min-fresh=60(单位: 秒)
,min-fresh 指令要求缓存服务器返回至少还未过指定时间的缓存资源 -
max-stale :
Cache-Control: max-stale=3600(单位: 秒)
,即使过期,客户端也会接收该资源,若指定参数,如=3600
,则表示在3600秒内,就算资源过期也可以接收资源。 -
only-if-cached:
Cache-Control: only-if-cached
,仅当资源在缓存服务器上缓存才要求返回。 -
must-revalidate :
Cache-Control: must-revalidate
,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。若代理无法获得资源,则会返回504(Gateway Timeout)
状态码。使用must-revalidate
指令会忽略请求的max-stale
指令 -
proxy-revalidate:
Cache-Control: proxy-revalidate
,要求所有的缓存服务器在接收到客户端带有该指
令的请求返回响应之前, 必须再次验证缓存的有效性。 -
no-transform :规定无论是在请求还是响应中, 缓存都不能改变实体主体的媒体类型。这样做可防止缓存或代理压缩图片等类似操作
1.2 缓存响应指令
-
no-cache :
Cache-Control: no-cache
,如果响应首部带上该字段,则表示禁止中间服务器对资源进行缓存,也不会对中间服务器提出的资源有效性进行验证。Cache-Control: no-cache=Location
,使用该指令并带上Location
这一参数值,则表示禁止用户本地对该响应报文进行缓存。 -
no-store :同请求的no-store一样
-
max-age:
Cache-Control: max-age=604800(单位 : 秒)
当服务器返回该指令时,代表缓存服务器将不对资源的有效性再作确认,而是把该指令的指定数值当作资源的缓存的最长时间。对浏览器而言,则是将该资源缓存在本地,在max-age
指定时间中都不会向服务器发起请求。 -
s-maxage:当
s-maxage=60
时,在这 60 秒中,即使更新了 CDN 的内容,浏览器也不会进行请求。也就是说 max-age 用于普通缓存,而 s-maxage 用于代理缓存。如果存在 s-maxage,则会覆盖掉 max-age 和 Expires header。 -
no-transform :规定无论是在请求还是响应中, 缓存都不能改变实体主体的媒体类型。这样做可防止缓存或代理压缩图片等类似操作
2. Connection(★)
2.1 请求
- 不再转发的首部字段名
Connection: 不再转发的首部字段名
,在请求转发过程中,删除不想给代理看到得首部字段(Hop-by-hop首部)
2.2 响应
- 不再转发的首部字段名
Connection: 不再转发的首部字段名
,在响应转发过程中,删除不想给代理看到得首部字段(Hop-by-hop首部) - close
HTTP/1.1 版本的默认连接都是持久连接。 为此, 客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时, 则指定Connection 首部字段的值为 Close。
3. Date
首部字段 Date 表明创建 HTTP 报文的日期和时间。HTTP/1.1 协议使用在 RFC1123
中规定的日期时间的格式, Date: Tue, 03 Jul 2012 04:40:59 GMT
4.Pragma
Pragma 是 HTTP/1.1 之前版本的历史遗留字段, 仅作为与 HTTP/1.0的向后兼容而定义。Pragma: no-cache
,该首部字段属于通用首部字段,只用于请求报文中,客户端要求所有中间服务器不返回缓存的资源。所有的中间服务器如果都能以 HTTP/1.1 为基准, 那直接采用 CacheControl: no-cache 指定缓存的处理方式是最为理想的。但要整体掌握全部中间服务器使用的 HTTP 协议版本却是不现实的。 因此, 发送的请求会同时含有下面两个首部字段。
Cache-Control: no-cache
Pragma: no-cache
5. Trailer
允许发送方在分块发送的消息后面添加额外的元信息。 该首部字段可应用在 HTTP/1.1 版本分块传输编码时。
6. Transfer-Encoding
首部字段 Transfer-Encoding 规定了传输报文主体时采用的编码方式。HTTP/1.1 的传输编码方式仅对分块传输编码有效。Transfer-Encoding: chunked
7.Upgrade(★)
首部字段 Upgrade 用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信, 其参数值可以用来指定一个完全不同的通信协议。使用首部字段 Upgrade 时, 还需要额外指定Connection:Upgrade
Upgrade: TLS/1.0。
8.Via
使用首部字段 Via 是为了追踪客户端与服务器之间的请求和响应报文的传输路径。
9. Warning
HTTP/1.1 的 Warning 首部是从 HTTP/1.0 的响应首部(Retry-After) 演变过来的。 该首部通常会告知用户一些与缓存相关的问题的警告。