HTTP
协议的请求和响应报文中必定包含 HTTP
首部,只是我们平时在使用 Web
的过程中感受不到它。
在我们开发的项目中,通过 Network
可以查看得到,到处都是。那么通过本章的内容我们来一起学习 HTTP
首部的结果,以及首部中各字段的用法。
HTTP 报文首部
报文首部
在客户端和服务器处理时起至关重要作用的信息几乎都在这边,而 报文主体
所需要的用户和资源的信息都在这边。
HTTP
协议的请求和响应报文中必定包含 HTTP
首部,首部这些内容为客户端和服务端分别处理请求和响应提供所需要的信息,对于客户端用户来说,这些信息中的大部分内容都无须亲自查看。
HTTP 请求报文
在请求中,HTTP
报文由方法是、URI
、HTTP
首部字段等部分构成。
在这些冲多的字节当中,HTTP
首部字段包含的信息最为丰富,首部字段同时存在于请求和响应报文内,并涵盖 HTTP
报文相关的内容信息。
HTTP 首部字段
HTTP
首部字段是构成 HTTP
报文的要素之一,在客户端和服务端之间以 HTTP
协议进行用心的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。
使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。
HTTP 首部字段结构
HTTP
首部字段是由首部字段名和字段值构成的,中间用冒号 ":"
分割。例如,在 HTTP
首部中以 COntent-Type
这个字段来表示报文主体的对象类型:
Content-type: text/html
字段值对应单个 HTTP
首部字段可以有多个值,如下所示:
Keep-Alive: timeout=15, max=100
当 HTTP
报文首部中出现了两个或两个以上具有相同首部字段名时会根据浏览器内部处理逻辑的不同,结果可能并不一致。
HTTP/1.1 通用首部字段
通用首部字段是指,请求报文和响应报文双方都会使用的首部。
Catch-Control
Cache-Control
是 HTTP
协议中的一个首部字段,用于控制缓存的行为。它可以指定缓存的类型、缓存的有效时间、缓存的范围等信息,以便浏览器和代理服务器能够更好地管理缓存。
指令的参数是可选的,多个指令之间通过 ","
分割,首部字段 Cache-Control
的指令可用于请求急响应时:
Cache-Control: private, max-age=0,no-cache
可用的指令按请求和响应分类如下所示:
- 请求缓存指令:
指令 | 参数 | 说明 |
---|---|---|
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-transition | 无 | 代理不可更改媒体类型 |
must-revalidate | 无 | 可缓存但必需再向资源服务器进行确认 |
proxy-revalidate | 无 | 要求中间缓存服务器对缓存的响应有效性再进行确认 |
max-age=[秒] | 必需 | 响应的最大 Age 值 |
s-maxage=[秒] | 必需 | 公共缓存服务器响应的最大 Age 值 |
cache-token | – | 新指令标记 (token) |
public
表示是否能缓存的指令,当 Cache-Control: public
时,则明确表明其他用户也可以利用缓存。
private
当指定为 private
指令之后,响应只以特定的用户作为对象,这与 public
指令的行为相反。
缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。
no-cache 指令
使用 no-cache
指令的目的是为了防止从缓存中返回过期的资源。
客户端发送的请求中如果包含 no-cache
指令,则表示客户端将不会接收缓存过的响应。于是缓存服务器必须把客户端请求转发给源服务器。
如果服务器返回的响应中包含 no-cache
指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止对其响应资源进行缓存操作。
Cache-Control: no-cache=LocationCache-Control: no-cache=LocationCache-Control: no-cache=Location
由服务器返回的响应中,若报文首部字段 Cache-Control
中对 no-cache
字段名具体指定参数值,那么客户端在接收到这个被指定参数值字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可以使用缓存。只能在响应中指定该参数。
no-store 指令
Cache-Control: no-storeCache-Control: no-storeCache-Control: no-store
当使用 no-store
指令时,暗示请求或响应中包含机密信息。因此,该指令规定缓存不能在本地存储请求或响应的任一部分。
s-maxage 指令
Cache-Control: s-maxage=604800Cache-Control: s-maxage=604800Cache-Control: s-maxage=604800
s-maxage
指令的功能和 max-age
指令的相同,它们的不同的是s-maxage
指令只适用于供多维用户使用的供缓存服务器(代理
)。也就是说,对于像同一用户重复返回响应的服务器来说,这个指令没有任何作用。
如果使用该指令,则直接忽略对 Expires
首部字段及 max-age
指令的处理。
max-age 指令
Cache-Control: max-age=604800Cache-Control: max-age=604800Cache-Control: max-age=604800
当客户端发送的请求中包含 max-age
指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源,另外,当指定 max-age
值为0,那么缓存服务器通常需要将请求转发给源服务器。
当服务器返回的响应中包含 max-age
指令时,缓存服务器将不对资源有效性进行确认,而 max-age
数值代表资源保存为缓存的最长时间。
在 HTTP/1.1
版本中,缓存服务器如果同时遇到 Expires
首部字段的情况时,会优先处理 max-age
指令,而忽略 Expires
首部字段。
min-fresh 指令
Cache-Control: min-fresh=60 (单位: 秒)Cache-Control: min-fresh=60 (单位: 秒)Cache-Control: min-fresh=60 (单位: 秒)
min-fresh
指令要求缓存服务器返回至少还未过指定时间的缓存资源。比如,当指定 min-fresh
为 60
秒后,在这 60
以内如果有超过有效期限的资源都无法作为响应返回了。
max-stale 指令
Cache-Control: max-stale=3600 (单位: 秒)Cache-Control: max-stale=3600 (单位: 秒)Cache-Control: max-stale=3600 (单位: 秒)
max-stale
指令用于控制缓存过期后的行为,当客户端向服务器发送带有 max-stale
指令的请求时,它告诉服务器即使缓存已过期,也可以接受过期的缓存响应。
如果指令为指定参数值,那么无论经过多久,客户端都会接收响应,如果指令中指定了具体数值,那么即使uguoqi,只要仍处于 max-stale
指令的时间内,仍旧会被客户端接收。
only-if-cached 指令
Cache-Control: only-if-cachedCache-Control: only-if-cachedCache-Control: only-if-cached
使用 only-if-cached
指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。换句话说就是,该指令要求缓存服务器不重复加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的缓存无响应,则返回状态码 504 Catcway Timeout
。
no-transformn 指令
Cache-Control: no-transformCache-Control: no-transformCache-Control: no-transform
使用 no-transform
指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。这样做可防止缓存或代理压缩图片等类似操作。
Connecton
该字段用于指示客户端和服务器之间的连接类型或控制连接的行为,它主要具备以下几个作用:
Connection: close
: 当客户端发送该头部时,它指示服务器在响应完成后关闭连接。这意味着每个请求都会建立一个新的连接。
Connection: keep-alive
:HTTP/1.1
版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求,就是说他可以在多个请求之间重用同一个TCP
连接,以减少每个请求的连接建立和关闭的开销。
值得注意的是,Connection
字段的解释和使用可能因协议和环境有所不同,它可以在 HTTP
、WebSocket
和其他协议中使用,并且可能会受到客户端和服务器的配置和支持程度的影响。
Transfer-Encoding
该字段同于指示在消息传输过程中对实体主体进行的编码方式,它通常包括:
Transfer-Encoding: chunked
:这是一种分块传输的编码方式。当服务器无法确定消息的完整长度时,可以使用分块传输编码。消息被分成一系列的块,每个块都包含其大小信息和块数据,以及一个最后的零大小块来标识消息结束;Transfer-Encoding: gzip
: 表示实体主体使用Gzip
压缩进行编码。服务器将实体主体进行压缩,然后在响应中发送压缩后的数据。客户端接收到响应后,会解压缩实体主体以还原原始内容;Transfer-Encoding: deflate
:类似于Gzip
,表示实体主体使用Deflate
压缩进行编码,它是一种压缩算法,用于减小数据的传输大小。
在 HTTP/2
中,由于引入了二进制分帧机制,该字段被废弃,而使用帧机制来传输消息体。
参考资料
- 书籍:
图解HTTP
;
总结
以上这些是一些常见的通用首部字段,用于在 HTTP 请求和响应中传递相关的控制、身份验证、缓存、内容类型等信息。在实际应用中,根据需求可能会使用其他首部字段来满足特定的功能和需求。