缓存分好多种:服务器缓存,第三方缓存,浏览器缓存等。其中浏览器缓存是代价最小的,因为浏览器缓存依赖的是客户端,而几乎不耗费服务器端的资源。浏览器做缓存需要给浏览器发送指定的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. Python socket TCPServer Demo

    #coding:utf-8 from SocketServer import TCPServer,BaseRequestHandler import traceback class MyBaseReq ...

  2. Data Structure Array: Largest subarray with equal number of 0s and 1s

    http://www.geeksforgeeks.org/largest-subarray-with-equal-number-of-0s-and-1s/ #include <iostream& ...

  3. python用特殊方法定制类(不全)

    定义在class中不需要直接调用,python的某些函数或操作符会自动的调用对应的特殊方法. 1.python中 __str__和__repr__ __str__()用于显示给用户,而__repr__ ...

  4. 3D卡片折叠动画自定义下拉框

    在线演示 本地下载

  5. mysql中的内连接,外连接实例详解

    内连接: 只连接匹配的行左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边 ...

  6. Storm- 使用Storm实现词频汇总

    需求:读取指定目录的数据,并实现单词计数的功能 实现方案: Spout来读取指定目录的数据,作为后续Bolt处理的input 使用一个Bolt把input 的数据,切割分开,我们按照逗号进分割 使用一 ...

  7. 重置 oschina 的CSS

    嗯, 目前只是改了一下OSChina的几个主要DIV宽度而以,还是很粗糙, 以后会慢慢改进的. ---------------------------------------------------- ...

  8. Queue 输出数据

    坑人的引用类型....输出看看结果是什么 Queue<ParaInfo> strStranList = new Queue<ParaInfo>(); StringBuilder ...

  9. node.js+express+jade系列四:jade嵌套的使用

    jade是express自带的模板引擎 jade文件可以嵌套使用,include引用外部jade文件,extends引用jade模板 例如 有一个主jade文件layout.jade,引用top.ja ...

  10. phpStudy如何修改端口及WWW目录

    phpStudy如何修改端口及WWW目录 phpStudy如何修改端口 请使用『其他选项菜单』-『phpStudy设置』-『端口常规设置』.