事实上有的浏览器还有一些更奇怪的行动,在后续我们答复文┞仿开首问题的时刻会提到。
石器时代的缓存方法
在 http1.0 时代,给客户端设定缓存方法可经由过程两个字段——“Pragma”和“Expires”来规范。固然这两个字段早可摈弃,但为了做http协定的向下兼容,你照样可以看到很多网站依旧会带上这两个字段。
1. Pragma
当该字段值为“no-cache”的时刻(事实上如今RFC中也仅标明该可选值),会知会客户端不要对该资本读缓存,即每次都得向办事器发一次请求才行。
Pragma属于通用首部字段,在客户端上应用时,惯例请求我们往html上加上这段meta元标签(并且可能还得做些hack放到body后面去):
- <meta http-equiv="Pragma" content="no-cache">
它告诉浏览器每次请求页面时都不要读缓存,都得往办事器发一次请求才行。
1. 仅有IE才能辨认这段meta标签含义,其它主流浏览器仅能辨认“Cache-Control: no-store”的meta标签(见出处)。
2. 在IE中辨认到该meta标签含义,并不必定会在请求字段加上Pragma,但切实其实会让当前页面每次都发新请求(仅限页面,页面上的资本则不受影响)。
做了测试后发明也切实其实如斯,这种客户端定义Pragma的情势根本没起到若干感化。
不过如不雅是在响应报文上加上该字段就不一样了:
如上图红框部分是再次刷新页面时生成的请求,这解释禁用缓存生效,估计浏览器在收到办事器的Pragma字段后会对资本进行标记,禁用其缓存行动,进而后续每次刷新页面均能从新发出请求而不走缓存。
2. Expires
Expires的值对应一个GMT(格林尼治时光),比如“Mon, 22 Jul 2002 11:12:01 GMT”来告诉浏览器资本缓存过不时光,如不雅还没过该时光点则不二请求。
在客户端我们同样可以应用meta标签来知会IE(也仅有IE能辨认)页面(同样也只对页面有效,对页面上的资本无效)缓存时光:
平日还知足这么个前提:
<meta http-equiv="expires" content="mon, 18 apr 2016 14:30:00 GMT">
如不雅欲望在IE下页面不走缓存,欲望每次刷新页面都能发新请求,那么可以把“content”里的值写为“-1”或“0”。
留意的是该方法仅仅作为知会IE缓存时光的标记,你并不克不及在请求或响应报文中找到Expires字段。
如不雅是在办事端报头返回Expires字段,则在任何浏览器中都能精确设置资本缓存的时光:

在上图里,缓存时光设置为一个已过时的时光点(见红框),则刷新页面将从新发送请求(见蓝框)。
那么如不雅Pragma和Expires一路上阵的话,听谁的?我们试一试就知道了:
我们经由过程Pragma禁用缓存,又给Expires定义一个还未到期的时光(红框),刷新页面时发明均提议了新请求(蓝框),这意味着Pragma字段的优先级会更高。
BUT,响应报文中Expires所定义的缓存时光是相对办事器上的时光而言的,如不雅客户端上的时光跟办事器上的时光不一致(特别是用户修改了本身电脑的体系时光),那缓存时光可能就没啥意义了。
Cache-Control
针对上述的“Expires时光是相对办事器而言,无法包管和客户端时光同一”的问题,http1.1新增了 Cache-Control 来定义缓存过不时光,若报文中同时出现了 Pragma、Expires 和 Cache-Control,会以 Cache-Control 为准。
当前各浏览器均是应用的该请求首部来向办事器传递保存的 Last-Modified 值。
Cache-Control也是一个通用首部字段,这意味着它能分别在请求报文和响应报文中应用。在RFC中规范了 Cache-Control 的格局为:
"Cache-Control" ":" cache-directive
作为请求首部时,cache-directive 的可选值有:
作为响应首部时,cache-directive 的可选值有:
我们依旧可以在HTML页面加上meta标签来给请求报头加上 Cache-Control 字段:
别的 Cache-Control 许可自由组合可选值,例如:
Vary 也接收据件组合的情势:
Cache-Control: max-age=3600, must-revalidate
它意味着该资本是大年夜原办事器上取得的,且其缓存(新鲜度)的有效时光为一小时,在后续一小时内,用户从新拜访该资本则无须发送请求。
当然这种组合的方法也话苄些限制,比如 no-cache 就不克不及和 max-age、min-fresh、max-stale 一路搭配应用。
组合的情势还能做一些浏览器行动不一致的兼容处理。例如在IE我们可以应用 no-cache 来防止点击“撤退撤退”按钮时页面资本大年夜缓存加载,但在 Firefox 中,须要应用 no-store 才能防止汗青回退时浏览器不大年夜缓存中去攫取数据,故我们在响应报头加上如下组合值即可做兼容处理:
Cache-Control: no-cache, no-store
缓存校验字段
上述的首部字段均能让客户端决定是否向办事器发送请求,比瘸黎置的缓存时光未过时,那么天然直接大年夜本地缓存取数据即可(在chrome下表示为200 from cache),若缓存时光过时了或资本不该直接走缓存,则会发请求到办事器去。
我们试着这么想——客户端上某个资本保存的缓存时光过时了,但这时刻其实办事器并没有更新过这个资本,如不雅这个资本数据量很大年夜,客户端请求办事器再把这个器械从新发一遍过来,是否异常浪费带宽和时光呢?
谜底是肯定的,那么是否有办法让办事器知道客户端如今存有的缓存文件,其实跟本身所有的文件是一致的,然后直接告诉客户端说“这器械你直接用缓存里的就可以了,我这边没更新过呢,就不再传一次以前了”。
推荐阅读
JOVIAL 计算机编程说话可用于将指令传达给计算机。它们基于某些句法和语义规矩,定义了编程说话中每种构造的含义。如今我获得了一个凡是可以找获得的每种编程说话的列表。我将它们分为以下>>>详细阅读
本文标题:浅谈浏览器http的缓存机制
地址:http://www.17bianji.com/lsqh/35221.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示