@Dale-Lin
2023-03-09T15:01:23.000000Z
字数 2511
阅读 206
web开发技术
Web缓存器(Web cache)也叫代理服务器(proxy server),它是能够代表初始 Web 服务器来满足 HTTP 请求的网络实体。Web cache 有自己的磁盘存储空间,并在存储空间内保存最近请求过的对象的副本。
举例来说,例如浏览器在请求 'https://www.someschool.edu/campus.gif',将会发生以下情况:
浏览器的缓存规则由在 HTTP 头中的定义规定。
验证由两方面组成:
Last-Modified
响应头部返回了资源最后更改的时间。
浏览器再次请求该资源时,协商使用缓存。一个足够新的缓存必须满足两个条件之一:
1. 含有完整的过期时间 HTTP 头,且仍在有效期内。
2. 浏览器使用过该缓存,并且在一个会话中用 If-Modified-Since: Date
检查过在缓存日期后没有发生变更。
If-Modified-Since
只能用于GET
或者HEAD
请求。非安全请求,例如,POST
只能使用If-Unmodified-Since
。
ETag: W/"<etag_value>"
或 ETag: "<etag_value>"
首部是资源特定版本的标识。在资源没有发生变更时,使用缓存更高效,并能节省带宽。特殊的以 W/
开头表示这是一个弱校验,只要资源的语义没有发生改变就认为相等,而不是 byte-for-byte 的相同。
在浏览器再次访问一个具有 ETag
首部的资源时,Web cache 会通过 If-None-Match: "<etag_value>"
首部来校验资源是否发生了变更,如果没有变更,服务器返回 304
Not Modified
协商缓存。
如果只有 Last-Modified 信息,缓存寿命 = (Date - Last-Modified) / 10。
规则 | 报头 | 值/示例 | 类型 | 作用 |
---|---|---|---|---|
新鲜度 | Expires | Sun, 16 Oct 2016 04:43:02 GMT | 响应 | 告知浏览器过期前可以使用缓存副本 |
Pragma | no-cache | 响应 | 告知浏览器忽略资源的缓存(http1.1 可用 cache-control) | |
Cache-Control | no-cache | 响应 | 告知浏览器忽略资源的缓存,强制每次请求直接发给源服务器进行协商(即使缓存新鲜也发送条件请求) | |
no-store | 响应 | 强制缓存不保留 | ||
max-age=[second] | 响应 | 指明缓存有效时长秒数 | ||
public | 响应 | 任何途径的缓存者都可以缓存 | ||
private | 响应 | 只针对单个用户或实体缓存 | ||
Last-Modified | Sun, 16 Oct 2016 04:43:02 GMT | 响应 | 告知浏览器当前资源的最后修改时间 | |
If-Modified-Since | Sun, 16 Oct 2016 04:43:02 GMT | GET/HEAD 请求 | 如果浏览器第一次请求时的 Last-Modified 值,会在第二次请求同一资源时作为该项发送 | |
If-Unmodified-Since | Wed, 21 Oct 2015 07:28:00 GMT | POST 请求 | 同上 | |
校验值 | ETag | 50b1c1d4f775c61:df3 | 响应 | 告知浏览器当前资源在服务器的唯一标识符 |
If-None-Match | 50b1c1d4f775c61:df3 | 请求 | 浏览器第一次请求获得的 Etag 会在第二次请求同一资源时作为该项发送 | |
辅助 | Vary | Accept-Encoding | 响应 | 辅助从多个缓存副本中筛选适合的版本 |
校验值优先级比新鲜度高,同时存在的情况下新鲜度会失效。
和资源的 Date 头部日期进行比较。
告知浏览器资源未修改,使用缓存并更新缓存时间。