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

    bytes object b = b"example" str object s = "example" #str to bytes bytes(s, enco ...

  2. ubuntu vim退出时出错

    E505: "vimrc" is read-only (add ! to override) wq退出时加!强制保存退出 "vimrc" E212: Can't ...

  3. vs2008 发布网站时丢失文件问题

    右键指定的文件->属性, 将生成操作更改成为"内容"就可以了.

  4. git错误收集总结

    一.在icoed添加ssh密钥后,克隆代码库报错`Permissions 0777 for ‘/Users/username/.ssh/id_rsa’ are too open.` 1.原因:id_r ...

  5. 跨平台(I版到K版)迁移实践总结

           所谓跨平台迁移,对于了解openstack冷迁移过程的同学来说,其实就是手动去执行冷迁移的代码行为,当然像我这种抵制体力劳动的人,肯定会想写脚本去跑,即使不会也要边学边用. 迁移并非想象 ...

  6. hd acm1466

    http://www.cnblogs.com/alihenaixiao/p/4107907.html#undefined.这个博客有详解,我这个只是写一些·自己的总结. 问题:平面上有n条直线,且无三 ...

  7. python 常用的字符串方法

    st = ' hello Kitty 'str = 'hello {name} {age}' #print(st.format(name='fadfa'))#常用的字符串方法print(st.coun ...

  8. ruanjiangongcheng1

    软体工程的方法有很多方面的意义.包括专案管理,分析,设计,程序的编写,测试和质量控制. 软体设计方法可以区别为重量级的方法和轻量级的方法.重量级的方法中产生大量的正式文档. 著名的重量级开发方法包括I ...

  9. MVC中Controller弹出提示框

    1.删除时查询是否有先关数据,有提示删除相关数据:成功刷新页面:失败提示删除失败 Controller: 有相关数据:return RedirectToAction("Index" ...

  10. jQuery中的动画理论干货

    [jQuery中的动画] 通过jQuery动画能够轻松地为页面添加精彩的视觉效果 [show()方法和hide()方法]1.show()方法和hide()方法是jQUERY中最基本的动画方法,相当于在 ...