网站内容更新机制(强缓存的最大有效时间和过期时间指令的区别?)
优采云 发布时间: 2022-02-18 04:07网站内容更新机制(强缓存的最大有效时间和过期时间指令的区别?)
通过设置 Expires 和 Cache-Control 响应标头可以实现强缓存。如果两者都存在,则 Cache-Control 优先于 Expires。
过期
过期响应头,它是 HTTP/1.0 的产物。表示资源的过期时间,其值为绝对时间。它告诉浏览器在过期时间之前直接从浏览器缓存中访问数据。由于是绝对时间,客户端和服务端的时间差或误差等因素可能会导致客户端和服务端的时间不一致,从而导致缓存命中错误。如果在 Cache-Control 响应标头中设置了 max-age 或 s-max-age 指令,则将忽略过期。
Expires: Wed, 21 Oct 2015 07:28:00 GMT
缓存控制
Cache-Control 出现在 HTTP/1.1 中。缓存机制可以通过指定多个指令来实现。主要用来表示资源缓存的最大有效时间。即在这个时间段内,客户端不需要向服务器发送请求。优先级高于过期。它的过期时间指令的值为相对时间,解决了绝对时间的问题。
Cache-Control: max-age=315360000
Cache-Control 有很多属性,不同的属性代表不同的含义。
可缓存性
已到期
重新验证并重新加载
其他
协商缓存可以由 last-Modified/If-Modified-Since 和 ETag/If-None-Match 标头控制。
Last-Modified, If-Modified-Since
Last-Modified和If-Modified-Since的值都是GMT格式的时间字符串,代表文件的最后修改时间。
当服务器响应请求时,会通过 Last-Modified 告诉浏览器资源的最后修改时间。
当浏览器再次向服务器请求时,请求头中会收录 Last-Modified 字段,后面是缓存中获取的最后修改时间。
当服务器收到带有 if-Modified-Since 的请求头时,会将其与请求的资源的最后修改时间进行比较。如果一致,则返回 304 和响应头。浏览器只需要从缓存中获取信息。如果已经修改,则开始整体发送响应,服务器返回:200 OK
但是,这种情况经常发生在服务器上。资源被修改,但它的实际内容根本没有改变。因为 Last-Modified 时间不匹配,所以将整个实体返回给客户端(即使客户端中有缓存)。相同的资源)。为了解决这个问题,HTTP/1.1 引入了Etag。Etag 具有高优先级和 Last-Modified。
Etag,如果没有匹配
Etag 是服务器为每个资源生成的唯一标识符,就像指纹一样。无论上次修改时间如何,资源的变化都会导致 ETag 的变化。ETags 可以确保每个资源都是唯一的。
当浏览器发起请求时,浏览器的请求消息头中会收录 If-None-Match 字段,该字段的值是上次返回并发送给服务器的 Etag。服务器收到第二条消息后,发现与 If-None-Match 所请求资源的唯一标识进行了比较。如果同样表示资源没有被修改,则返回304,浏览器直接从缓存中获取数据信息。如果不一样,则说明资源发生了变化,响应整个资源内容,返回状态码200。
总结
通过上一篇文章我们了解到HTTP缓存主要分为强制缓存和协商缓存。强制缓存由Cache-Control控制,Exipres(HTTP1.0)。浏览器直接读取本地缓存,不再与服务器交互,状态码200。协商缓存由Last-控制。 Modified / IfModified- 由于实现了Etag /If-None-Match,每次请求都需要让服务器判断资源是否被更新,从而判断浏览器是否使用缓存,如果是则返回304,否则完成再次回应。