缓存分好多种:服务器缓存,第三方缓存,浏览器缓存等。其中浏览器缓存是代价最小的,由于浏览器缓存依赖的是客户端,而几乎不耗费服务器端的资源。浏览器作缓存须要给浏览器发送指定的Http头,告诉浏览器缓存多长时间,或者坚定不要缓存。windows
1.Expires: +过时时间数组
表示在指定时间后浏览器缓存失效浏览器
这里的过时时间必须是http格式的日期时间, 其余都会被解析成当前时间"以前", 缓存会立刻过时. http的日期时间必须是格林威治时间(GMT), 而不是本地时间缓存
e.g. Fri, 30 Oct 2009 13:13:13服务器
使用Expires过时必需要求服务器的时间是正确的,不然发送的http头就会出问题, 在windows服务下能够设置时间服务器来同步时间网站
2.Cache-control: 缓存控制url
控制缓存值分为: 代理
max-age=[秒]: 执行缓存被认为是最新的最长时间. 相似于过时时间, 这个参数是基于请求时间的相对时间间隔, 而不是绝对过时时间, [秒]是一个数组, 单位是秒: 从请求时间到过时时间之间的秒数图片
s-maxage=[秒]: 相似于max-age属性, 除了他应用于共享(如: 代理服务器)换粗资源
public: 仅体如今响应头. 通知浏览器能够无条件地缓存该响应. 标记认证内容也能够被缓存. 通常来讲, 通过http认证才能访问的内容, 输出是自动不能够缓存的
private: 仅体如今响应头, 通知浏览器只针对单个用户缓存响应, 且能够具体指定某个字段, 如private-"username"
no-cache: 强制每次请求之间发送给源服务器, 而不通过本地缓存版本的校验. 这对于须要确认认证应用颇有用(能够和public结合使用), 或者严格要求使用最新数据的应用(不惜牺牲使用缓存的全部好处)
请求头中: 告诉浏览器回去服务器取数据, 并验证你的缓存(若是有的话)
响应头中: 告诉浏览器, 必定要回服务器校验, 无论有没有缓存数据. 若是肯定没有修改, 可使用缓存中的数据
no-store: 告诉浏览器任何状况下都不要被缓存
must-revalidate: 告诉浏览器必须遵循全部你给予副本的新鲜度的, http容许缓存在某些特定状况下返回过时数据, 指定了这个属性, 你告诉缓存, 你但愿严格的遵循你的规则proxy-revalidate: 和must0revalidate相似, 除了他只对缓存代理服务器起做用
e.g. Cache-Control: max-age=3600, must-revalidate。
3. Last-Modified/If-Modified-Since
这两个Http头是一对,表示某个地址的最近更新时间端有一个最后更改时间为何时间的缓存,Last-Modified 是服务器发送给客户端。If-Modified-Since是客户端发送给服务器。服务器端接收到If-Modified-Since后则判断客户端缓存的这份url地址的缓存是不是最新的,若是是最新的则服务器端直接给客户端返回HttpStatus 304,意思是说这个内容在你上次请求以后没有变化过,你直接用缓存就能够了;若是服务器发现url的最后更新时间比If-Modified-Since的值要新,则会输出新的内容。
4. ETag/If-None-Match
ETag和Last-Modified相似,不过他发送的是一个字符串来标示url的版本,若是url变了则此标示也跟着变化,在浏览器发送If-None-Match时告诉浏览器内容已经变了,或者没变可使用缓存。
list会自动给静态文件加上Etag,在文件发生改变时从新生成一个Etag,这样对于一个网站中的n多个静态文件如:样式表,小图片等,客户端只下载一次就够了,能够减轻负载。
5.Pragma: no-cache
是http1.0中的常规头, 做用同http1.1的Cache-Control: no-cache
关于以上缓存机制的优先级:
Cache-Control > Expires : 前者设置更详细
Cache-Control/Expires > Last-Modified/ETag : 本地副本根据Cache-Control/Expires还在有效期内, 则不会在此发送请求去服务器询问修改时间或实体标识了 即最前面的最重要, 前面的生效后, 后面进本就失效。
彻底匹配If-Modified-Since和If-None-Match即检查完修改时间和ETag后, 服务器才能返回304;