关于这个问题其实袈溱组内跟小伙伴们评论辩论过,经由过程Fiddler抓包发明,如不雅封闭Chrome的开辟者面板再点击“刷新”按钮,浏览器是会按预期发送验证请求且接收返回的304响应的,别的┞封个奇怪的情况在不合的网站甚至不合的电脑下出现频率都不一致,所以临时将其归咎于浏览器的怪异反竽暌功。
那么竽暌剐这么一个问题——是否有办法在浏览器点击“刷新”按钮的时刻不让浏览器去发新的验证请求呢?
办法照样有的,就是不怎么实用——在页面加载完毕后经由过程脚本动态地添加资本:
- $(window).load(function() {
- var bg='http://img.infinitynewtab.com/wallpaper/100.jpg';
- setTimeout(function() { //setTimeout是必须的
- $('#bgOut').css('background-image', 'url('+bg+')');
- },0);
- });
出处来自知乎,更具体的解释可以去看看。
其它相干的首部字段
事实上较常用和重要的缓存相干字段我们都介绍完了,这里顺带讲讲几个跟缓存有关系,但没那么重要的响应首部字段。
1. Vary
“vary”本身是“变更”的意思,而在http报文中更趋于是“vary from”(与。。。不合)的含义,它表示办事端会以什么基准字段来区分、筛选缓存版本。
是以 Vary 就是着手处理该问题的首部字段,我们可以在响应报文加上:
- Vary: User-Agent
便能知会代劳办事器须要以 User-Agent 这个请求首部字段来差别缓存版本,防止传递给客户端的缓存不精确。
- Vary: User-Agent, Accept-Encoding
这意味着办事器应以 User-Agent 和 Accept-Encoding 两个请求首部字段来区分缓存版本。
2. Date 和 Age
HTTP并没有供给某种办法来帮用户区分其收到的资本是否射中了代劳办事器的缓存,但在客户端我们可以经由过程计算响应报文中的 Date 和 Age 字段来获得谜底。
办事器将资本传递给客户端时,会将资本最后更改的时光以“Last-Modified: GMT”的情势加在实体首部上一路返回给客户端。
Date 理所当然是原办事器发送该资本响应报文的时光(GMT格局),如不雅你发明 Date 的时光与“当前时光”差别较大年夜,或者持续F5刷新发明 Date 的值都没变更,则解释你当前请求是射中了代劳办事器的缓存。
上述的“当前时光”天然是相对于原办事器而言的时光,那么若何获悉原办事器的当前时光呢?
惯例大年夜页面地址请求的响应报文中可获得,以博客园首页为例:
每次你刷新页面,浏览器都邑从新发出这条url的请求,你会发明其 Date 值是赓续变更的,这解释该链接没有射中缓存,都是大年夜原办事器返回过来的数据。
静态资本Age + 静态资本Date = 原办事端Date
我们在膳绫擎那张博客园首页报文截图的同个场景下,看看某个文件(jQuery.js)射中代劳办事器缓存的回包数据:
会发明它知足我们上述的规矩:
- //return true
- new Date('Mon, 04 Apr 2016 07:03:17 GMT')/1000 == new Date('Sat, 19 Dec 2015 01:29:14 GMT')/1000 + 9264843
不过这条规矩也不必定精确,特别是当原办事器经常修改体系时光的情况下。
关于http缓存道理的常识就整顿到这,欲望能让你有所收成,共勉~
【编辑推荐】
- 用Python实现每秒处理120万次HTTP请求
- 浅谈浏览器缓存机制
- 深刻懂得HTTPS道理、过程与实践
- 一文读懂 HTTP/2 特点
- pyspider爬虫教程 (2):AJAX和HTTP
推荐阅读
JOVIAL 计算机编程说话可用于将指令传达给计算机。它们基于某些句法和语义规矩,定义了编程说话中每种构造的含义。如今我获得了一个凡是可以找获得的每种编程说话的列表。我将它们分为以下>>>详细阅读
本文标题:浅谈浏览器http的缓存机制
地址:http://www.17bianji.com/lsqh/35221.html
1/2 1

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