浏览器缓存机制主要就是HTTP协议定义的缓存机制,header中的expires,Cache-Control那些的
也有非HTTP协议定义的缓存机制,使用HTML Meta标签,可以如下:
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
上面的代码什么作用呢?意思是告知浏览器当前页面不被缓存,也就是说每次访问都需要去服务器中
获取。这种有很大的局限性,因为只有少部分浏览器支持,而且所有的缓存代理服务器都不支持--代理不解析HTML内容本身
HTTP定义的缓存机制
1.Expires策略,HTTP1.0的东西,现在基本看不到
Expires是服务器响应消息头的一个字段,告诉浏览器在这个字段指定的时间之前浏览器可以直接从
浏览器本地缓存取数据,不需要再次请求
2.Cache-Control策略
这个也是用来指明当前资源的有效期,控制浏览器是从浏览器缓存里面取数据还是重新发送请求到服务器取数据。
与Expires相比,Cache-Control的选择更多,设置更加细致,且优先级高于Expires
Cache-Control的一些指令:
Public指示响应可被任何缓存区缓存。
Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
no-cache指示请求或响应消息不能缓存
no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
3.Last-Modified/If-Modified-Since
这个需要配合Cache-Control一起使用
Last-Modified:就是表示这个资源最后修改的时间,因为缓存数据虽然可能没有过期,但是服务器中的对应资源已经修改过了
这时候就需要重新请求为佳
If-Modified-Since:当资源过期时,发现资源具有Last-Modified,再次向服务器请求时
带上If-Modified-Since表示请求时间,服务器将这个请求的时间与Last-Modified进行比较,有可能资源虽然过期了,但是没有更改过,所以为了节省流量,可以返回304状态码,告诉浏览器直接使用缓存数据,否则重新发送数据给浏览器
4.Etag/If-None-Match:
这个也要配合Cache-Control使用
Etag:服务器响应请求时,告诉浏览器这个资源在服务器的唯一标识(由服务器觉得的)
比如索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。
If-None-Match:如果资源过期了,发现资源有Etag声明,则再次向服务器请求,并且带上头If-None-Match(Etag的值)
服务器收到请求发现有If-None-Match,则与服务器的相应hash串进行比对,决定重新返回数据还是让浏览器使用缓存数据
可能大家会觉得Etag有些多余,但其实一点都不多余:
- Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间,就有可能出现明明需要重新返回数据给浏览器却变成了让浏览器继续使用缓存的情况
- 如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存,这就导致了网络通信的流量不必要的增加
Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。
服务器会优先验证Etag,一致的话,继续对比Last-Modified,最后才决定是否返回304状态码