缓存

在 HTTP/1.1 协议 http://www.w3.org/Protocols/rfc2616/rfc2616.html 里,

HTTP 的缓存处理步骤。

  • 步骤一,第一次请求文件时。

    服务器响应头中将给出该文件的缓存相关属性

    • Cache-Control 缓存控制开关
    • Expires 缓存超时时间(HTTP/1.0 遗留,被 Cache-Control 代替)
    • Pragma 是否禁用(HTTP/1.0 遗留,被 Cache-Control 代替)
    • Last-Modified 文件最后修改时间
    • ETag 文件标识
  • 步骤二,第二次请求文件时,浏览器根据当前缓存的属性做出下一步的判断。

    首先通过 Pragma 和 Cache-Control 判断本地缓存开关,优先级 Pragma > Cache-Control。如果判断缓存禁用,则直接向服务器请求文件,并要求服务器禁止缓存。

    如果缓存开启,则通过 Expires 和 Cache-Control 判断缓存时间是否超时,优先级顺序是 Cache-Control > Expires。如果判断缓存可用,则直接使用本地缓存,不进行任何请求。

    如果判断缓存超时,则向服务器发起请求,进入步骤三。

  • 步骤三,浏览器判断缓存超时了,这时浏览器请求需要附加上当前缓存的相关属性,由服务器进行判断是否缓存。

    如果当前缓存存在 Last-Modified 属性,则浏览器提交 If-Modified-Since 头,要求服务器判断文件修改时间是否更新。

    如果当前缓存存在 ETag 属性,则浏览器提交 If-None-Match 头,让服务器判断文件 Hash 值是否匹配。

    优先级 If-None-Match > If-Modified-Since,如果服务器认为缓存任然有效,则返回 HTTP 304 告诉浏览器缓存未修改。

参考:

浏览器缓存详解:expires,cache-control,last-modified,etag详细说明

HTTP缓存控制小结

缓存控制方案

google 给出了比较合理的缓存控制方案