HTTP之如何控制缓存
HTTP控制缓存的能力
===================摘自《HTTP权威指南》====================================
服务器可以通过HTTP定义的几种方式来指定在文档过期之前可以将其缓存多长时间。按照优先级递减的顺序,服务器可以:
(1)、附加一个Cache-control:no-store首部到响应中去;
(2)、附加一个Cache-control:no-cache首部到响应中去;
(3)、附加一个Cache-control:must-revalidate首部到响应中去;
(4)、附加一个Cache-control:max-age首部到响应中去;
(5)、附加一个Expires日期首部到响应中去;
(6)、不附加过期信息,让缓存确定自己的过期日期;
1、no-store与no-cache响应首部
HTTP/1.1提供了几种限制对象缓存,或限制提供已缓存对象的方式,以维持对象的新鲜度。No-store首部和no-cache首部可以防止缓存提供未经证实的已缓存对象:
Pragma:no-cache
Cache-control:no-store
Cache-control:no-ca
标识为no-store的响应会禁止缓存对响应进行复制。缓存通常会像非缓存代理服务器一样,向客户端转发一条no-store响应,然后删除对象。
标识为no-cache的响应实际上是可以存储在本地缓存区中的。只是在与服务器进行新鲜度再验证之前,缓存不能将其提供给客户端使用。这个首部使用do-not-serve-from-cache- without-revalidation这个名字会更恰当一下。
HTTP/1.1提供了pragma:no-cache首部是为了兼容HTTP/1.0+。除了与只理解pragma:no-cache的HTTP/1.0应用程序进行交互时,HTTP/1.1应用程序都应该使用Cache-control:no-cache。
2、max-age响应首部
Cache-control:max-age首部表示的是从服务器将文档传来之时起,可以认为此文档处于新鲜状态的秒数。还有一个s-maxage首部(注意maxage的中间没有连接字符),其行为与max-age类似,但仅使用与共享(公有)缓存:
Cache-control:max-age=3600
Cache-control:s-maxage=3600
服务器可以请求缓存不要缓存文档,或者将最大使用期设置为零,从而在每次访问的时候都进行刷新:
Cache-control:max-age=0
Cache-control:s-maxage=0
3、Expires响应首部
不推荐使用Expires首部,它指定的是实际过期日期而不是秒数。HTTP设计者后来认为,由于很多服务器的时钟都不同步,或者不正确,所以最好还是使用剩余秒数,而不是绝对时间来表示过期时间。可以通过计算过期值和日期值之间的秒数差来计算类似的新鲜生存期:
Expires:Fri,05 Jul 2002,05:00:00 GMT
有些服务器还会回送一个Expires:0响应首部,试图将文档置于永远过期的状态,但这种语法是非法的,可能给某些软件带来问题。应该试着支持这种结构的输入,但不应该产生这种结构的输出。
4、must-revalidate响应首部
可以配置缓存,使其提供一些陈旧(过期)的对象,以提高性能。如果原始服务器希望缓存严格过期信息,可以在原始响应中附加一个cache-control:must-revalidate首部。
cache-control:must-revalidate
cache-control:must-revalidate
响应首部告诉缓存,在事先没有跟原始服务器再验证的情况下,不能提供这个对象的陈旧副本。缓存仍然可以随意提供新鲜副本。如果在缓存进行must-revalidate新鲜度检查时,原始服务器不可用,缓存就必须返回一条504Gateway Timeout错误。
5、试探性过期
如果响应中没有Cache-control:max-age首部,也没有Expires首部,缓存可以计算出一个试探性最大使用期。可以使用任意算法,但如果得到的最大使用期大于24小时,就应该向响应首部添加一个Heuristic Expiration Warning(试探性过期警告,警告13)首部。据我们所知,很少有浏览器会为用户提供这种警告信息。
6、客户端的新鲜度限制
Web浏览器都有Refresh(刷新)或reload(重载)按钮,可以强制对浏览器或代理缓存中可能过期的内容进行刷新。Refresh按钮会发布一个附加了Cache-control请求首部的Get请求,这个请求会强制进行再验证,或者无条件的从服务器中获取文档。Refresh的确切行为取决于特定浏览器、文档以及拦截缓存的配置。
客户度可以用Cache-control请求首部来强化或放松对过期时间的限制。有些应用程序对文档的新鲜度要求很高(比如人工刷新按钮),对这些应用程序来说,客户端可以使用Cache-control首部使过期时间更严格。另一方面,作为提高性能、可靠性或开支的一种折中方式,客户端可能会放松新鲜度要求。表7-4对Cache-control请求指令进行了总结:

HTTP之如何控制缓存的更多相关文章
- servlet 的控制缓存时间和response的重定向
//控制缓存时间 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletE ...
- 通过HTTP Header控制缓存
我们经常通过缓存技术来加快网站的访问速度,从而提升用户体验.HTTP协议中也规定了一些和缓存相关的Header,来允许浏览器或共享高速缓存缓存资源.这些Header包括: Last-Modified ...
- 重新想象 Windows 8.1 Store Apps (90) - 通信的新特性: 通过 HttpBaseProtocolFilter 实现 http 请求的缓存控制,以及 cookie 读写; 自定义 HttpFilter; 其他
[源码下载] 重新想象 Windows 8.1 Store Apps (90) - 通信的新特性: 通过 HttpBaseProtocolFilter 实现 http 请求的缓存控制,以及 cooki ...
- 通过HTTP头控制浏览器的缓存
通过HTTP头控制浏览器的缓存 浏览器缓存是提高用户体验和提升程序性能的一个很重要的途径,通过浏览器的缓存控制,可以对实时性要求不高的数据进行缓存,可以减少甚至不需要再次对服务器的请求就可以显示数据. ...
- HTTP 缓存控制总结
引言 通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本.因此,缓存和重用以前获取的资源的能力成为 ...
- HTTP缓存控制总结
引言 通过网络获取内容既缓慢,成本又高.大的相应需要在客户端和服务器之间多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了通信的成本.因此,缓存和重用以前获取到的资源的能力成为性能优化 ...
- php如何控制客户端生成缓存
php如何控制客户端生成缓存 一.总结 一句话总结:用http消息响应头中的Cache-Control来控制客户端缓存,说的是页面本身被客户端缓存,而不是重新生成的其它的非页面缓存 响应头Cache- ...
- 网页的缓存Cache与控制
什么是缓存 Cache? 缓存位于客户端与服务器之间, 或者服务器与服务器之间.它决定是否保存所获资源的副本,以及如何使用副本,何时更新副本,这里所说的资源包括页面的HTML, 图片,文件等等. 使用 ...
- 什么是Web缓存控制(基于HTTP头域)
这是一篇转载的知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中.为了简要起见,某些实现方面的细节被简化或省略了.如果你更关心细节实现则完全不必耐心看完本文,后 ...
随机推荐
- ASP.NET Core Web 项目文件
在本节中,我们将探索并了解 asp.net core 项目文件. 我们使用 C#作为编程语言,因此项目文件具有.csproj 扩展名. 如果您使用过以前版本的 ASP.NET,那么您可能对此文件非常熟 ...
- BUUCTF 随便注
知识点: ##堆叠注入 #预语句注入 https://www.cnblogs.com/0nth3way/articles/7128189.html#autoid-1-0-0 正则过滤了很多关键字导致无 ...
- Alpha版本1发布
这个作业属于哪个课程 课程的链接 这个作业的要求在哪里 作业要求的链接 团队名称 西柚三剑客 这个作业的目标 -Alpha版本发布说明 1. 团队成员的学号列表 团队成员 学号 whisperzxx( ...
- int数据类型的最大数
/* 32位系统 */ #include <stdio.h> int main() { , b = ; ) { ; } printf(); ; do { n = n / ; b++; } ...
- 树莓派搭建SVN服务器
1.安装SVN服务器 sudo apt-get install subversion -y 2.创建仓库 mkdir /home/pi/svnRepository svnadmin create /h ...
- c# 第13节 迭代语句、while、do...while、for、foreach、goto
本节内容: 1:迭代语句是什么 2:迭代语句之while 3:迭代语句之 do...while 4:迭代语句之for 5:迭代语句之foreach: 6:跳转语句break.continue.retu ...
- Mybatis-Plus Bugs
Mybatis-Plus Bugs 实体类中属性和数据库字段对应异常 Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'user ...
- Gson:
- JavaScript中的this—你不知道的JavaScript上卷读书笔记(三)
this是什么? this 是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件.this 的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式.当一个函数被调用时,会 ...
- AWS云教育账号创建以及搭建数据库
注册过程繁琐,本文强调关键几点 首先拿到aws的二维码,进入之后填写相关个人信息,用学校邮箱注册,用学校邮箱注册!! 之后审核会有大约10分钟的过程,之后会收到确认邮件 点进去之后就可以设置自己的密码 ...