浏览器缓存

浏览器缓存

一、强制缓存

1、Expires字段

HTTP1.0:该字段表示缓存到期时间,即有效时间+当时服务器的时间,然后将这个时间设置在header中返回给服务器。因此,该时间是一个绝对时间例如:

Expires: Thu, 10 Nov 2017 08:45:11 GMT

缺点:
由于是绝对时间,用户可能会将客户端本地的时间进行修改,而导致浏览器判断缓存失效,重新请求该资源,同时,还导致客户端与服务端的时间不一致,致使缓存失效。

2、Cache-Control字段

已知Expires的缺点之后,在HTTP/1.1中,增加了一个字段Cache-Control,该字段表示资源缓存的最大有效时间,在该时间内,客户端不需要向服务器发送请求。
这两者的区别就是前者是绝对时间,而后者是相对时间。我们不妨举个例子来说明一下:

Cache-Control: max-age=2592000

下面列举一下Cache-Control的字段可以带的值:
max-age:即最大有效时间,在上面的例子中我们可以看到
no-cache:表示没有缓存,即告诉浏览器该资源并没有设置缓存
s-maxage:同max-age,但是仅用于共享缓存,如CDN缓存
public:多用户共享缓存,默认设置
private:不能够多用户共享,HTTP认证之后,字段会自动转换成private。
总结一下,自从http1.1开始,Expires逐渐被Cache-Control取代。Cache-Control是一个相对时间,即使客户端时间发生改变,相对时间也不会随之改变,这样可以保持服务器和客户端的时间一致性。而且Cache-Control的可配置性比较强大。

二、对比缓存

1、Last-Modefied字段

Last-Modified:服务器在响应头中告知客户端,资源最后一次被修改的时间,例如

Last-Modified: Thu, 10 Nov 2015 08:45:11 GMT

If-Modified-Since:再次请求时,请求头中带有该字段,服务器会将If-Modified-Since的值与Last-Modified字段进行对比,如果相等,则表示未修改,响应304;反之,则表示修改了,响应200状态码,返回数据。

这个字段可以和Cache-Control配合使用。
但是他还是有一定缺陷的:
如果资源更新的速度是秒以下单位,那么该缓存是不能被使用的,因为它的时间单位最低是秒。
如果文件是通过服务器动态生成的,那么该方法的更新时间永远是生成的时间,尽管文件可能没有变化,所以起不到缓存的作用。

2、Etag标识

Etag存储的是文件的特殊标识(一般都是hash生成的),服务器存储着文件的Etag字段,可以在与每次客户端传送If-no-match的字段进行比较,如果相等,则表示未修改,响应304;反之,则表示已修改,响应200状态码,返回数据。

你可能感兴趣的:(浏览器缓存)