强缓存
浏览器缓存分为强缓存和协商缓存:强缓存不需要发送网络请求,强制使用本地缓存;协商缓存需要发送网络请求,根据服务响应来决定是否使用本地缓存。
浏览器访问网站时首先会检查强缓存,如果缓存资源未过期则直接使用本地缓存。
- Expires:过期时间
- Cache-Control:相比于请求时间的有效期
- Cache-Control: max-age=3600
- private
- public
- no-cache:在发布缓存副本前,强制要求把请求提交给原始服务器进行验证(协商缓存验证)
- no-store:不使用任务缓存
协商缓存
协商缓存主要流程:
1. 浏览器在请求头中设置相应的字段
2. 服务器根据请求头判断是否使用缓存,并返回判断结果
3. 浏览器根据服务器响应结果决定是否使用缓存
- Last-Modified:资源最后修改时间
- Etag:资源唯一标识
Last-Modified即服务器上资源最后修改的时间。
主要流程如下:
1. 浏览器首次发送网络请求时,服务器会在响应头中添加Last-Modified字段
2. 浏览器接收此字段后,在后续请求时会在请求头中添加If-Modified-Since字段,此字段的值就是Last-Modified的值,即资源作出最后修改的时间
3. 当服务器接收到请求头中的If-Modified-Since字段后,会和服务器中资源的最后修改时间进行比较;如果请求头中的字段值早于服务器中资源的最后修改时间,表示缓存资源需要更新,即返回服务器中的资源;否则返回状态码304,通知浏览器直接使用缓存资源。
Etag是服务器给文件生成的唯一标识,通常使用内容的散列、最后修改时间戳的Hash值或简单地使用版本号。
主要流程如下:
1. 与Last-Modified类似,浏览器首次发送网络请求时,服务器会通过响应头通知浏览器ETag的值
2. 浏览器接收此字段后,在后续请求时会在请求头中添加If-Modified-Since字段,此字段的值就是Etag的值,即服务器资源的唯一标识
3. 当服务器接收到请求头中的If-Modified-Since字段后,会和服务器中资源的Etag值进行比较。如果值相同则返回状态码304,否则返回新的资源