1. 强缓存(Strong Caching)
强缓存允许浏览器直接从本地缓存中读取资源,而不向服务器发送请求。强缓存通过 HTTP 头中的 Cache-Control 和 Expires 字段来控制。
- Cache-Control:这是 HTTP/1.1 引入的头字段,支持多种指令,例如:
- max-age:指定资源被缓存的最长时间(以秒为单位)。
- public:指示响应可以被任何缓存存储,包括 CDN 缓存。
- private:指示响应只能被浏览器缓存。
- no-cache:强制浏览器每次都向服务器发送请求进行验证。
- no-store:禁止缓存,所有请求和响应都不会被缓存。
- Expires:这是 HTTP/1.0 使用的头字段,用于指定资源的过期时间点。这个时间点是一个具体的日期和时间。例如:Expires: Tue, 19 Jan 2021 20:00:00 GMT 。如果 Cache-Control 头字段也存在,Expires 将被忽略。
Cache-Control: max-age=3600
Expires: Tue, 19 Jan 2021 20:00:00 GMT
在资源的有效期内(max-age 或 Expires 指定的时间内),浏览器会直接从本地缓存中读取资源,而不再向服务器发送请求。
(快速的本地缓存机制,在有效期内可以直接使用,无需与服务器交互)
2. 协商缓存(Negotiated Caching)
协商缓存是在缓存过期或者缓存策略要求验证时,浏览器向服务器发送请求,服务器根据请求头中的某些字段决定资源是否发生了变化。如果资源没有变化,服务器返回 304 Not Modified 状态码,并且浏览器继续使用本地缓存的资源。
协商缓存使用以下 HTTP 头字段:
- Last-Modified / If-Modified-Since:
- Last-Modified:服务器在响应中返回资源的最后修改时间。
- If-Modified-Since:浏览器在请求中包含上次获取资源时服务器返回的 Last-Modified 时间,服务器根据此时间判断资源是否发生了变化。
- ETag / If-None-Match:
- ETag:服务器在响应中返回资源的一个唯一表示(实体标签)。
- If-None-Match:浏览器在请求中包含上次获取资源时服务器返回的 ETag 值,服务器根据此值判断资源是否发生了变化。
Last-Modified: Tue, 19 Jan 2021 20:00:00 GMT
If-None-Match: "686897696a7c876b7e"
如果资源没有变化,服务器返回 304 状态码,并且不返回资源主体内容;如果资源发生变化,服务器返回 200 状态码,并返回新的资源内容。
(更可靠的验证机制,当强缓存失效时,通过与服务器协商来判断资源是否需要更新)
3. 总结
- 强缓存:资源在指定时间内无需向服务器发送请求,直接从缓存读取。
- 协商缓存:资源可能需要向服务器发送请求,服务器决定资源是否需要更新。