缓存分好多种:服务器缓存,第三方缓存,浏览器缓存等。其中浏览器缓存是代价最小的,因为浏览器缓存依赖的是客户端,而几乎不耗费服务器端的资源。浏览器做缓存需要给浏览器发送指定的Http头,告诉浏览器缓存多长时间,或者坚决不要缓存。

1.Expires: +过期时间

表示在指定时间后浏览器缓存失效

这里的过期时间必须是http格式的日期时间, 其他都会被解析成当前时间"之前", 缓存会马上过期. http的日期时间必须是格林威治时间(GMT), 而不是本地时间

e.g.  Fri, 30 Oct 2009 13:13:13

使用Expires过期必须要求服务器的时间是正确的,否则发送的http头就会出问题, 在windows服务下可以设置时间服务器来同步时间

2.Cache-control: 缓存控制

控制缓存值分为:  

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;

HTTP之缓存首部的更多相关文章

  1. 前端学HTTP之报文首部

    前面的话 首部和方法配合工作,共同决定了客户端和服务器能做什么事情.在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些.本文将详细介绍HTTP报文中的首部 结构 ...

  2. HTTP首部

    前面有几篇博文介绍了HTTP协议.HTTP请求方法详解.Javascript中Cookie的那些事儿.HTTPS,今天我们来聊一聊关于HTTP首部的那些事儿 HTTP协议的请求和响应报文中肯定包含HT ...

  3. http协议进阶(三)补充:报文首部

    之前写的关于报文首部的传送门: 报文首部:http://www.cnblogs.com/imyalost/p/5708445.html 通用首部字段:http://www.cnblogs.com/im ...

  4. HTTP首部及各状态码

    通用首部:客户端和服务器都可以使用的通用首部,比如Status Code: 请求首部:请求首部是请求报文特有的,它们为服务器提供了一些额外信息,例如Accept: */* 用来告知服务器客户端会接受与 ...

  5. HTTP 缓存控制总结

    引言 通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本.因此,缓存和重用以前获取的资源的能力成为 ...

  6. HTTP缓存控制总结

    引言 通过网络获取内容既缓慢,成本又高.大的相应需要在客户端和服务器之间多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了通信的成本.因此,缓存和重用以前获取到的资源的能力成为性能优化 ...

  7. nginx的反向代理功能和缓存功能

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  8. http协议进阶(四)报文首部

    之前写的关于报文首部的传送门: 报文首部:http://www.cnblogs.com/imyalost/p/5708445.html 通用首部字段:http://www.cnblogs.com/im ...

  9. HTTP缓存控制

    HTTP缓存控制总结   引言 通过网络获取内容既缓慢,成本又高.大的相应需要在客户端和服务器之间多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了通信的成本.因此,缓存和重用以前获取 ...

随机推荐

  1. MainWindows

    开发带有菜单栏状态栏等常用windows应用时候使用

  2. 3django url name详解

    打开urls.py from django.conf.urls import url from django.contrib import admin from calc import views a ...

  3. [原创]java WEB学习笔记09:ServletResponse & HttpServletResponse

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. React Native 列表的总结

    React Native 列表的总结 FlatList和SectionList都是React Native中高性能的列表组件.这些新的列表组件在性能方面都有了极大的提升, 其中最主要的一个是无论列表有 ...

  5. nginx配置大全

    nginx配置大全

  6. Apache 的 httpd.conf 注释

    ServerRoot “/usr/local“ ServerRoot用于指定守护进程httpd的运行目录,httpd在启动之后将自动将进程的当前目录改变为这个目录,因此如果设置文件中指定的文件或目录是 ...

  7. 常量池、perm(持久代)、方法区、栈

      常量池.perm(持久代).方法区.栈 常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据. 除了包含代码中所定义的各种基本类型(如:int.long等等)和对象型(如St ...

  8. Jquery + css 日期控件用法实例.zip

    /*==============================================================================** Filename:common.j ...

  9. webserver的编写中出现的问题

    在webserver编写过程中,出现过问题.就是标签<input>编写过程中少了name属性,导致程序无法读到<form>提交的数据.

  10. dos命令行中不同磁盘的调转

    windows下,dos中不同磁盘的跳转: 直接 盘符+回车: 如跳转到d盘: D:回车即可 : Microsoft Windows [版本 10.0.10586] (c) 2015 Microsof ...