关于HTTP缓存
2017-05-08 17:35
169 查看
鉴于面试总是被问到这个问题,而且之前也是懂得大概,因此查看了MDN、阅读了《HTTP权威指南》,以及一些好的博客,这可能是我写得最全面的HTTP缓存了吧。
Cache-Control可以通过设置max-age值来指定缓存的有效期(单位:秒)。
Cache-Control: max-age=3153600
Expires可以指定一个特定的缓存过期时间,效果同Cache-Control的max-age一样。
Expires: Fri, 01 Jul 2016 00:00:00 GMT
Cache-Control是浏览器设置还是服务器设置?
Cache-Control 通用消息头被用于在http 请求和响应中通过指定指令来实现缓存机制。缓存指令是单向的, 这意味着在请求里设置的指令,在响应中不用包含相同的指令。
意思就是浏览器设置了Cache-control,服务器端就不用设置?
浏览器Request:
Cache-Control: max-age=
Cache-Control: max-stale[=]
Cache-Control: min-fresh=
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached
服务器Response
Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=
Cache-control: s-maxage=
可以看到区别请求和响应都可以设置 no-cache, no-store,max-age。其他的都不一样。
可缓存性
public
表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存。
private
表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。
only-if-cached
表明如果缓存存在,只使用缓存,无论原始服务器数据是否有更新。
no-cache
强制所有缓存了该响应的缓存用户,在使用已存储的缓存数据前,发送带验证器的请求到原始服务器
到期
max-age=
设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。与Expires相反,时间是相对于请求的时间。
s-maxage=
覆盖max-age 或者 Expires 头,但是仅适用于共享缓存(比如各个代理),并且私有缓存中它被忽略。
max-stale[=]
表面客户端愿意接收一个已经过期的资源。 可选的设置一个时间(单位秒),表示响应不能超过的过时时间。
私有缓存与公有缓存
可以看到服务器端设置cache-control的参数有private和public,private强制只能被个人用户缓存,也就是私有缓存。而设置为public的话,表示可以被任何对象缓存,即公有缓存。
私有缓存
Web浏览器中有内建的私有缓存——大多数浏览器会将常用的文档缓存在你的个人电脑的磁盘和内存中,并且允许用户去配置缓存的大小等。例如,IE就可以从Tools(工具)——Internet Options查看,Navigator可以通过URL about:cache查看。
公有代理缓存
公有代理是特殊的共享代理服务器
Cache-Control和Expire
以前一直以为只有浏览器可以设置cache-control,然而并不是:Cache-Control可以通过设置max-age值来指定缓存的有效期(单位:秒)。
Cache-Control: max-age=3153600
Expires可以指定一个特定的缓存过期时间,效果同Cache-Control的max-age一样。
Expires: Fri, 01 Jul 2016 00:00:00 GMT
Cache-Control是浏览器设置还是服务器设置?
Cache-Control 通用消息头被用于在http 请求和响应中通过指定指令来实现缓存机制。缓存指令是单向的, 这意味着在请求里设置的指令,在响应中不用包含相同的指令。
意思就是浏览器设置了Cache-control,服务器端就不用设置?
浏览器Request:
Cache-Control: max-age=
Cache-Control: max-stale[=]
Cache-Control: min-fresh=
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached
服务器Response
Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=
Cache-control: s-maxage=
可以看到区别请求和响应都可以设置 no-cache, no-store,max-age。其他的都不一样。
可缓存性
public
表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存。
private
表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。
only-if-cached
表明如果缓存存在,只使用缓存,无论原始服务器数据是否有更新。
no-cache
强制所有缓存了该响应的缓存用户,在使用已存储的缓存数据前,发送带验证器的请求到原始服务器
到期
max-age=
设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。与Expires相反,时间是相对于请求的时间。
s-maxage=
覆盖max-age 或者 Expires 头,但是仅适用于共享缓存(比如各个代理),并且私有缓存中它被忽略。
max-stale[=]
表面客户端愿意接收一个已经过期的资源。 可选的设置一个时间(单位秒),表示响应不能超过的过时时间。
私有缓存与公有缓存
可以看到服务器端设置cache-control的参数有private和public,private强制只能被个人用户缓存,也就是私有缓存。而设置为public的话,表示可以被任何对象缓存,即公有缓存。
私有缓存
Web浏览器中有内建的私有缓存——大多数浏览器会将常用的文档缓存在你的个人电脑的磁盘和内存中,并且允许用户去配置缓存的大小等。例如,IE就可以从Tools(工具)——Internet Options查看,Navigator可以通过URL about:cache查看。
公有代理缓存
公有代理是特殊的共享代理服务器
相关文章推荐
- 关于http 缓存处理的步奏
- 关于http缓存详解
- [缓存]C# HTTP多线程断点续传下载,关于迅雷的HTTP请求中的range标头的疑问
- 关于http缓存的理解
- HTTP请求响应关于缓存技术的探讨
- 关于HTTP 头中缓存的部分
- 关于HTTP协议中的缓存概念
- 关于上下文System.Web.HttpContext
- Squid+MRTG实现完善的缓存代理和http服务加速代理
- 关于SqlDataReader遍历和缓存结果集
- Squid+MRTG实现完善的缓存代理和http服务加速代理
- 关于 HTTP 中的 Get 和 Post 方法的区别?
- 淺談資料庫設計(关于树的设计等实例)http://www.omama.org/mt-archives/000007.php
- 关于设置Http请求超时的办法
- 关于用IDhttp发送网站http头的问题
- 关于mysql数据的导出(http://blog.csdn.net/davidullua/services/trackbacks/21982.aspx )
- 关于缓冲、缓存等几个易混淆的概念
- 都是缓存惹得祸 (转至http://blog.csdn.net/kwklover/)
- 补充关于iBatis的缓存使用
- 关于在IBM httpserver服务中添加报表服务器的说明