304 Not Modified 缓存机制是HTTP协议中非常重要的一环,它允许浏览器在特定条件下复用本地缓存,从而减少网络请求,加快页面加载速度,并节省带宽。 它主要依赖于If-Modified-Since
和If-None-Match
这两个HTTP请求头,以及Last-Modified
和ETag
这两个HTTP响应头协同工作。
以下是304缓存机制的详细解释:
1. 浏览器第一次请求资源:
- 浏览器向服务器发送请求,获取资源。
- 服务器返回资源,并在响应头中包含
Last-Modified
和ETag
。Last-Modified
:资源在服务器上的最后修改时间。ETag
:资源的实体标签,可以理解为资源的唯一标识符,通常是根据资源内容生成的哈希值。
2. 浏览器再次请求相同资源:
- 浏览器检查本地缓存中是否有该资源的副本。
- 如果有,浏览器会将缓存中的
Last-Modified
值添加到请求头If-Modified-Since
中,并将缓存中的ETag
值添加到请求头If-None-Match
中,然后发送请求给服务器。
3. 服务器处理请求:
- 服务器接收到请求后,会将请求头中的
If-Modified-Since
和If-None-Match
与资源当前的Last-Modified
和ETag
进行比较。 - 如果资源没有被修改过 (即
If-Modified-Since
等于或晚于Last-Modified
,并且If-None-Match
与ETag
相同),服务器返回304 Not Modified
状态码,不包含资源内容。 - 如果资源已被修改过,服务器返回
200 OK
状态码,并返回最新的资源内容以及新的Last-Modified
和ETag
。
4. 浏览器处理响应:
- 如果收到
304 Not Modified
,浏览器就知道可以使用本地缓存的资源,从而避免了下载资源,节省了时间和带宽。 - 如果收到
200 OK
,浏览器会更新本地缓存,并将新的资源渲染到页面上。
关键点总结:
Last-Modified
和If-Modified-Since
基于时间进行比较,精度为秒级,如果资源修改时间小于一秒,可能导致缓存失效。ETag
和If-None-Match
基于资源内容的哈希值进行比较,更加精确,可以避免Last-Modified
的精度问题。- 服务器可以只使用
Last-Modified
或ETag
,也可以两者都使用。最佳实践是两者都使用,以提供更可靠的缓存机制。 - 304 缓存机制是协商缓存的一种,它需要浏览器和服务器之间进行通信来确定是否使用缓存。
- 对于一些不会频繁更改的静态资源,例如图片、CSS、JavaScript 文件等,使用 304 缓存机制可以显著提高网站性能。
前端开发中的注意事项:
- 正确设置
Cache-Control
、Expires
等响应头,以控制缓存的有效期。 - 对于需要实时更新的资源,可以添加版本号或时间戳等参数到 URL 中,以强制浏览器重新请求资源,避免使用缓存。
- 使用构建工具 (例如Webpack) 可以自动为静态资源添加哈希值,方便实现缓存控制。
通过理解和正确使用 304 缓存机制,可以有效提升网站的性能和用户体验。
标签:缓存,Last,304,Modified,理解,浏览器,资源 From: https://www.cnblogs.com/ai888/p/18581059