Expires/Cache协议与上述验证协议最大的不一样在于,他能够省略发送验证请求环节,不须要服务器的验证,而直接使用本地缓存。 一般这种方式,适用于,项目稳定,版本迭代很少的时候。
Expires
在服务器端能够设置Expires的一个绝对时间。css
//Response Headers Expires:Tue, 03 May 2016 09:33:34 GMT
这告诉浏览器,在2016.5.3号以前,能够直接使用该文本的缓存副本。可是,可能会由于服务器和客户端的GMT时间不一样,会有必定的bug。 因此,这里只提议在长时间缓存的状况下使用。不然,应该选择Cache-Control.
那在服务器端该怎么设置呢? 这里以nginx为例:nginx
location ~* \.(?:css|js)$ { expires 1d; access_log off; add_header Cache-Control "public"; }
经过expires设置过时时间为一天,此时,服务器会根据当前的时间,加上一天.同时添加Expires和Cache-Control头部标签。
即,获得的Response Header为:浏览器
Expires: Fri, 28 Feb 2014 10:42:09 GMT Cache-Control: max-age=86400 //24*60*60
(HTTP规定,若是出现max-age和expires,则max-age默认覆盖掉expires)
当expires为负数表示no-cache,正数或零表示max-age=time。
若是你不想缓存,能够直接设置:缓存
expires -1; //永远过时,Cache-Control: no-cache
详细能够直接参阅:nginx配置服务器
Cache-Control
这应该是HTTP1.1为了解决HTTP1.0中expires的时间差的bug,而新添加的一个tag. 他的配置项不少,其实彻底均可以取代expires(如今大多数服务器都支持). 引用一段原话:代理
Cache-Control 头在 HTTP/1.1 规范中定义,取代了以前用来定义响应缓存策略的头(例如 Expires)。当前的全部浏览器都支持 Cache-Control,所以,使用它就够了。
不过,目前大部分服务器都会将二者添加上,由于HTTP规定,若是Cache-Control和expires同时出现的话,expires会默认被覆盖掉。
此时,返回的响应码再也不是304(文件未改动),而是200(资源成功访问).code
当前每次发送请求以前浏览器会检查缓存系统里,是否有相应文件的备份,若是有的话,则直接从本地模仿一个Response头
理论知识铺垫完毕,咱们来take a look. 看看cache-control 有哪些能够配置的属性(如下属性都跟在cache-control后)资源
public: 共有缓存,可被缓存代理服务器缓存,好比CDN private: 私有缓存,不能被共有缓存代理服务器缓存,可被用户的代理缓存如浏览器。 max-age=[秒]:表示在这个时间范围内缓存是新鲜的无需更新。相似Expires时间,不过这个时间是相对的,而不是绝对的。也就是某次请求成功后多少秒内缓存是新鲜的。 s-maxage=[秒]:相似max-age, 除了仅应用于共享缓存(如代理)。 no-cache:这里不是不缓存的意思,只是每次在使用缓存以前都强制发送请求给源服务器进行验证,检查文件该没改变(其实这里和ETag/Last区别不大) no-store:就是禁止缓存,不让浏览器保留缓存副本 must-revalidate:告诉浏览器,你这必须再次验证检查信息是否过时, 返回的代号就不是200而是304了。 proxy-revalidate:相似must-revalidate,除了只能应用于代理缓存。 好比,这里我能够设置Cache-Control为: //Response Headers Cache-Control:private, max-age=0, must-revalidate
该文件是一个私有文件,只能被浏览器缓存,而不能被代理缓存。max-age标识该缓存当即过时,其实和no-cache实际上区别不大. 而后must-revalidate告诉浏览器,你必须给我再验证文件过没过时,好比接下来可能会验证Last-Modified或者ETag.若是没有过时则使用本地缓存.io