强缓存
不向服务器发请求,直接从本地硬盘(from disk cache/from memory cache)或者内存中获取
- expires和cache-control
- expires :http/1.0时的规范,它是一个绝对时间。如果客户端和服务端的时间相差过大时,会出现混乱
- cache-control: http/1.1规范。主要利用max-age来判断。以秒作为单位。如:Cache-Control:max-age=600,代表着资源的有效期是600秒(10分钟)。
Cache-Control的优先级高于Expires
协商缓存
涉及Header中两组字段: Last-Modified/If-Modified-Since 或 ETag/If-None-Match
若第一次的响应头没有Last-Modified或ETag,则后续的请求头部也不会有If-Modified-Since或If-None-Match。
- Last-Modified/If-Modified-Since
在第一次请求后,响应头会返回If-Modified-Since字段,代表服务器最后一次修改资源的时间,在下一次请求时,会将此再返回给服务器。会根据资源的最后修改时间来判断是否命中协商缓存,如果命中,则返回304.未命中返回200. - ETag资源的唯一标识
ETag可以保证每一个资源都是唯一的,资源变化都会导致ETag变化
服务器根据接收到的If-None-Match来判断是否命中协商缓存
为什么要有ETag?不是已经有Last-Modified吗
- 一些文件或许会周期性的修改,但是它的内容没有变化(只是改变了修改时间),这个时候我们并不希望客户端认为这个文件修改了,而重新获取。
- 某些文件在1秒内修改了N次,用If-Modified-Since无法进行区分,因为If-Modified-Since的时间最小单位是秒。
- 某些服务器不能精确的得到文件的最后修改时间。
Last-Modified和ETag可以一起使用,但是ETag的优先级大于Last-Modified,当ETag相同的情况下,才会继续比较Last-Modified,最后才决定是否返回304。
网友评论