关于HTTP缓存

来源:互联网 发布:迅雷看看有mac版吗 编辑:程序博客网 时间:2024/06/15 10:39

鉴于面试总是被问到这个问题,而且之前也是懂得大概,因此查看了MDN、阅读了《HTTP权威指南》,以及一些好的博客,这可能是我写得最全面的HTTP缓存了吧。

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查看。

公有代理缓存
公有代理是特殊的共享代理服务器

0 0
原创粉丝点击