浏览器强缓存、协商缓存及缓存控制策略
2023-12-28 15:19:49
在浏览器与服务器的交互过程中,缓存扮演着重要的角色。缓存可以有效地减少不必要的网络请求,提高网页加载速度,改善用户体验。浏览器缓存分为强缓存和协商缓存,二者在工作原理和使用场景上有所区别。
强缓存
强缓存是指浏览器直接从缓存中获取资源,而不会发送请求到服务器。强缓存的命中条件是请求头中包含 Expires 或者 Cache-Control: max-age 指令,并且当前时间在 Expires 指定的时间点之前,或者在 Cache-Control 指定的 max-age 时间范围内。
例如,如果服务器在响应头中设置了 Expires: Wed, 21 Oct 2020 07:28:00 GMT,那么浏览器会在 2020 年 10 月 21 日 07:28:00 GMT 之前直接从缓存中获取该资源,而不会发送请求到服务器。
协商缓存
协商缓存是指浏览器向服务器发送请求,但服务器不会直接返回资源,而是返回一个 304 Not Modified 状态码,浏览器收到 304 状态码后,直接从缓存中获取资源。协商缓存的命中条件是请求头中包含 Last-Modified 或者 ETag 指令,并且服务器返回 304 状态码。
例如,如果服务器在响应头中设置了 Last-Modified: Wed, 21 Oct 2020 07:28:00 GMT,那么浏览器在下次请求该资源时,会在请求头中带上 Last-Modified: Wed, 21 Oct 2020 07:28:00 GMT,服务器收到请求后,会比较 Last-Modified 的值,如果资源没有发生改变,则返回 304 状态码,浏览器收到 304 状态码后,直接从缓存中获取资源。
Cache-Control 指令
Cache-Control 是一个 HTTP 头指令,用于控制缓存的行为。Cache-Control 指令可以出现在请求头和响应头中。
在请求头中,Cache-Control 指令可以用来指定浏览器希望服务器返回的缓存策略。常用的 Cache-Control 指令有:
- no-cache:指示服务器不要使用缓存,必须从源服务器获取资源。
- max-age=seconds:指示服务器在指定的时间内缓存资源。
- max-stale=seconds:指示服务器在指定的时间内返回陈旧的缓存资源。
- no-store:指示服务器不要缓存资源。
在响应头中,Cache-Control 指令可以用来指定服务器的缓存策略。常用的 Cache-Control 指令有:
- public:指示资源可以被所有用户缓存。
- private:指示资源只能被当前用户缓存。
- no-cache:指示浏览器不要使用缓存,必须从源服务器获取资源。
- max-age=seconds:指示浏览器在指定的时间内缓存资源。
- s-maxage=seconds:指示代理服务器在指定的时间内缓存资源。
Last-Modified 和 ETag 指令
Last-Modified 和 ETag 是两个 HTTP 头指令,用于指示资源的最后修改时间和实体标签。
Last-Modified 指令指示资源的最后修改时间,格式为 RFC 1123。例如:Last-Modified: Wed, 21 Oct 2020 07:28:00 GMT。
ETag 指令指示资源的实体标签,实体标签是一个唯一的字符串,由服务器生成。例如:ETag: "1234567890abcdef"。
缓存控制策略
在实际应用中,可以根据不同的场景选择合适的缓存控制策略。常用的缓存控制策略有:
- 强缓存策略:当资源不经常发生变化时,可以使用强缓存策略。强缓存策略可以有效地减少不必要的网络请求,提高网页加载速度。
- 协商缓存策略:当资源经常发生变化时,可以使用协商缓存策略。协商缓存策略可以保证浏览器始终获取到最新的资源。
- 缓存绕过策略:当资源需要实时更新时,可以使用缓存绕过策略。缓存绕过策略可以强制浏览器从源服务器获取资源。
结论
浏览器缓存是提高网页加载速度的重要技术。通过合理使用缓存控制策略,可以有效地减少不必要的网络请求,提高用户体验。