缓存的问题一直都是我们比较头痛的问题,为了提高网站响应速度,减少服务器的负担,和节省带宽,将需要将静态资源缓存在客户端,
但是有些时候,当这些文件有更新的时候,我们又希望这些缓存能够尽快失效。所以怎么很好的利用缓存功能,而又不影响我们的正常更新。
了解这些缓存机制,就非常有必要。
浏览器通过URL地址访问一个网页时,浏览器会自动缓存用户访问过网站的网页,当用户下一次在访问这个页面的时候,浏览器就会跟自己本地缓存的页面进行比较
如果网页没有更新的话,浏览器就不会再次下载网页,而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新,浏览器才会再次下载网页。
HTTP 缓存相关的几个重要的Header
Cache-Control
Cache-Control 这是HTTP缓存最重要的头部字段,用于指定所有缓存机制在整个请求 / 响应 中必须服从的命令。
cache-control 的定义是:Cache-Control = “Cache-Control”
public 所有内容都将被缓存
private 内容只缓存到私有缓存中
no-cache 所有内容都不会被缓存
no-store 所有内容都不会被缓存到缓存或 Internet 临时文件中
must-revalidation/proxy-revalidation 如果缓存的内容失效,请求必须发送到服务器 / 代理以进行重新验证
max-age=xxx (xxx is numeric) 缓存的内容将在 xxx 秒后失效 , 这个选项只在 HTTP 1.1 可用 , 并如果和 Last-Modified 一起使用时 , 优先级较高
Cache-Control 是关于浏览器缓存的最重要的设置,因为它覆盖其他设置,比如 Expires 和 Last-Modified 。另外,由于浏览器的行为基本相同,这个属性是处理跨浏览器缓存问题的最有效的方法。
Expires
Expires 头部字段提供一个日期和时间,响应在该日期和时间之后被认为缓存失效。失效的缓存条目通常不会被浏览器返回。
Expires 的定义是 “Expires: Sun, 08 Nov 2009 03:37:26 GMT”。如果查看内容时的日期在给定的日期之前,则认为该内容没有失效并从缓存中提取出来。反之,则认为该内容失效,缓存将采取一些措施。
注意:cache-control max-age 和 s-maxage 将覆盖 Expires 头部。
Last-Modified/E-Tag
Last-Modified 实体头部字段值通常用作一个缓存验证器。简单来说,在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,
内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:Last-Modified: Fri, 12 May 2006 18:53:33 GMT ,当第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:如果服务器端的资源没有变化,则返回 HTTP 304 (Not Changed.)状态码。而不是响应的文件。
ETag 是根据web资源生成的一段hash字符串。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,当资源发送改变时,ETag也随之发生变化
以下是服务器端返回的格式:
ETag: "50b1c1d4f775c61:df3"
客户端的查询更新格式是这样的:
If-None-Match: W/"50b1c1d4f775c61:df3"
如果ETag没改变,则返回状态304,这也和Last-Modified一样。