?HTTP常见的通用首部字段

HTTP 协议的请求和响应报文中必定包含 HTTP 首部,只是我们平时在使用 Web 的过程中感受不到它。

image.png

在我们开发的项目中,通过 Network 可以查看得到,到处都是。那么通过本章的内容我们来一起学习 HTTP 首部的结果,以及首部中各字段的用法。

HTTP 报文首部

image.png

报文首部 在客户端和服务器处理时起至关重要作用的信息几乎都在这边,而 报文主体 所需要的用户和资源的信息都在这边。

HTTP 协议的请求和响应报文中必定包含 HTTP 首部,首部这些内容为客户端和服务端分别处理请求和响应提供所需要的信息,对于客户端用户来说,这些信息中的大部分内容都无须亲自查看。

HTTP 请求报文

在请求中,HTTP 报文由方法是、URIHTTP 首部字段等部分构成。

image.png

在这些冲多的字节当中,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-ControlHTTP 协议中的一个首部字段,用于控制缓存的行为。它可以指定缓存的类型、缓存的有效时间、缓存的范围等信息,以便浏览器和代理服务器能够更好地管理缓存。

指令的参数是可选的,多个指令之间通过 "," 分割,首部字段 Cache-Control 的指令可用于请求急响应时:

Cache-Control: private, max-age=0,no-cache

可用的指令按请求和响应分类如下所示:

  1. 请求缓存指令:
指令 参数 说明
no-cache 强制向资源服务器再次验证
no-store 不缓存请求或响应的任何内容
max-age=[秒] 必需 响应最大的 Age 值
max-stale( = [秒]) 可省略 接收已过期的响应
min-fresh=[秒] 必需 期望在指定时间内的响应仍有效
no-transform 代理不可更改媒体类型
only-if-cached 从缓存获取资源
cache-extension 新指令标记 (token)
  1. 缓存响应指令:
指令 参数 说明
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 指令的行为相反。

image.png

缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。

no-cache 指令

image.png

使用 no-cache 指令的目的是为了防止从缓存中返回过期的资源。

客户端发送的请求中如果包含 no-cache 指令,则表示客户端将不会接收缓存过的响应。于是缓存服务器必须把客户端请求转发给源服务器。

如果服务器返回的响应中包含 no-cache 指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止对其响应资源进行缓存操作。

Cache-Control: no-cache=Location
Cache-Control: no-cache=Location
Cache-Control: no-cache=Location

由服务器返回的响应中,若报文首部字段 Cache-Control 中对 no-cache字段名具体指定参数值,那么客户端在接收到这个被指定参数值字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可以使用缓存。只能在响应中指定该参数。

no-store 指令

Cache-Control: no-store
Cache-Control: no-store
Cache-Control: no-store

当使用 no-store 指令时,暗示请求或响应中包含机密信息。因此,该指令规定缓存不能在本地存储请求或响应的任一部分。

s-maxage 指令

Cache-Control: s-maxage=604800
Cache-Control: s-maxage=604800
Cache-Control: s-maxage=604800

s-maxage 指令的功能和 max-age 指令的相同,它们的不同的是s-maxage 指令只适用于供多维用户使用的供缓存服务器(代理)。也就是说,对于像同一用户重复返回响应的服务器来说,这个指令没有任何作用。

如果使用该指令,则直接忽略对 Expires 首部字段及 max-age 指令的处理。

max-age 指令

image.png

Cache-Control: max-age=604800
Cache-Control: max-age=604800
Cache-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-fresh60 秒后,在这 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-cached
Cache-Control: only-if-cached
Cache-Control: only-if-cached

使用 only-if-cached 指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。换句话说就是,该指令要求缓存服务器不重复加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的缓存无响应,则返回状态码 504 Catcway Timeout

no-transformn 指令

Cache-Control: no-transform
Cache-Control: no-transform
Cache-Control: no-transform

使用 no-transform 指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。这样做可防止缓存或代理压缩图片等类似操作。

Connecton

该字段用于指示客户端和服务器之间的连接类型或控制连接的行为,它主要具备以下几个作用:

  1. Connection: close: 当客户端发送该头部时,它指示服务器在响应完成后关闭连接。这意味着每个请求都会建立一个新的连接。

image.png

  1. Connection: keep-alive: HTTP/1.1 版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求,就是说他可以在多个请求之间重用同一个 TCP 连接,以减少每个请求的连接建立和关闭的开销。

image.png

值得注意的是,Connection 字段的解释和使用可能因协议和环境有所不同,它可以在 HTTPWebSocket 和其他协议中使用,并且可能会受到客户端和服务器的配置和支持程度的影响。

Transfer-Encoding

该字段同于指示在消息传输过程中对实体主体进行的编码方式,它通常包括:

  1. Transfer-Encoding: chunked:这是一种分块传输的编码方式。当服务器无法确定消息的完整长度时,可以使用分块传输编码。消息被分成一系列的块,每个块都包含其大小信息和块数据,以及一个最后的零大小块来标识消息结束;
  2. Transfer-Encoding: gzip: 表示实体主体使用 Gzip 压缩进行编码。服务器将实体主体进行压缩,然后在响应中发送压缩后的数据。客户端接收到响应后,会解压缩实体主体以还原原始内容;
  3. Transfer-Encoding: deflate:类似于 Gzip,表示实体主体使用 Deflate 压缩进行编码,它是一种压缩算法,用于减小数据的传输大小。

HTTP/2 中,由于引入了二进制分帧机制,该字段被废弃,而使用帧机制来传输消息体。

参考资料

  • 书籍: 图解HTTP;

总结

以上这些是一些常见的通用首部字段,用于在 HTTP 请求和响应中传递相关的控制、身份验证、缓存、内容类型等信息。在实际应用中,根据需求可能会使用其他首部字段来满足特定的功能和需求。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYKOaV2Q' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片