<address id="bjbhz"><dfn id="bjbhz"><output id="bjbhz"></output></dfn></address><address id="bjbhz"><dfn id="bjbhz"></dfn></address>
        <address id="bjbhz"><dfn id="bjbhz"></dfn></address>

        <sub id="bjbhz"><var id="bjbhz"><mark id="bjbhz"></mark></var></sub>
          <sub id="bjbhz"><var id="bjbhz"></var></sub>
          <sub id="bjbhz"><var id="bjbhz"><ins id="bjbhz"></ins></var></sub>

          <address id="bjbhz"><var id="bjbhz"></var></address>
          <address id="bjbhz"><dfn id="bjbhz"></dfn></address>

          <address id="bjbhz"><listing id="bjbhz"><ins id="bjbhz"></ins></listing></address>

            <thead id="bjbhz"></thead>

          通过HTTP Header控制缓存

          我们经常通过缓存技术来加快网站的访问速度,从而提升用户体验。HTTP协议中也规定了一些和缓存相关的Header,来允许浏览器或共享高速缓存缓存资源。这些Header包括:

          • Last-Modified 和 If-Modified-Since
          • ETag 和 If-None-Match
          • Expires
          • Cache-Control
            以上Header又可以分成两种类型:

          • 协商缓存:浏览器发送验证到服务器,由服务器决定是否从缓存中读取,如 1 和 2 。
          • 强缓存:浏览器验证缓存的有效性,然后决定是否从缓存中读取数据,如 3 和 4 。
            本文将会分别介绍这四种配置的作用以及可能产生的影响。

          1、Last-Modified 和 If-Modified-Since
          Last-Modified:服务器在响应请求时,告知浏览器资源的最后修改时间。

          If-Modified-Since:浏览器再次发送请求时,会通过此Header通知服务器在上次请求时所得到的资源最后修改时间。服务器会将If-Modified-Since与被请求资源的最后修改时间进行比对。若资源的最后修改时间晚于If-Modified-Since,表示资源已被改动,则响最新的资源,返回200状态码;若资源的最后修改时间早于或等于If-Modified-Since,表示浏览器端的资源已经是最新版本,响应304状态码,通知浏览器继续使用缓存中的资源。

          2、ETag 和 If-None-Match
          ETag:服务器分配给资源的唯一标识符,资源被修改后,ETag也会随之发生变化。

          If-None-Match:浏览器再次发送请求时,会通过此Header通知服务器已缓存资源的ETag。服务器会将If-None-Match与被请求资源的最新ETag进行比对。若不相同,表示资源已被改动,则响应最新的资源,返回200状态码;若值相同,则直接响应304状态码,通知浏览器继续使用缓存中的资源。

          3、Expires
          服务器可以通过此Header向浏览器传递一个具体的时间(格林威治格式,例如:Thu, 19 Jul 2018 07:43:05 GMT) ,来明确地宣告资源的有效期。在资源过期之前,浏览器不再发送请求,而是直接从缓存中读取数据。只有当资源过期之后,浏览器才会再次向服务器请求该资源。

          4、Cache-Control
          服务器使用此Header来向客户端建议缓存策略,它有一下几个可选值:

          max-age=秒:告知浏览器缓存的有效时长,在该时间内浏览器将直接从缓存中读取数据。

          s-maxage=秒:作用同max-age,但是只对共享高速缓存(如CDN)有效,对浏览器无效。

          no-cache:告知浏览器不要直接使用缓存,而是必须向服务器发送请求。

          no-store:告知浏览器不要缓存本次请求和响应的任何信息。

          public:宣告任何缓存媒介都可以缓存该响应。

          private:宣告该响应只允许个体客户端(如浏览器)去缓存,而不允许共享高速缓存(如CDN)去缓存。

          在上面的介绍中我们了解到浏览器会根据max-age设置的时间进行缓存。而通过研究发现CDN也会识别源站响应头中Cache-Control属性,根据max-age设置的时间进行缓存,但是,如果源站同时设置了s-maxage和max-age,那么CDN会优先采用s-maxage。

          下面通过图例来展示一下这些可选值的效果。

          首先了解一下浏览器是怎样根据max-age进行缓存的:
          通过HTTP Header控制缓存

          从上图不难发现,服务器在Header中返回了Cache-Control: max-age=100后,浏览器成功缓存100秒,该时间段内的请求都从直接以本地缓存来响应。

          那么,服务器在Header中返回Cache-Control:s-maxage=100时,又会对浏览器产生什么样的影响呢?

          通过HTTP Header控制缓存

          如上图所示,浏览器没有采取任何缓存策略,这是因为s-maxage面向的是共享高速缓。

          上面这两个例子很容易理解,在现实世界中,为了加快网站响应速度,我们可能会在浏览器和服务器之间引入CDN服务。浏览器的请求会先到达CDN,然后CDN判断是从缓存中读取数据还是回源到服务器。接下来,让我们看看max-age和s-maxage会对CDN的缓存策略带来哪些影响。
          通过HTTP Header控制缓存

          可以看出CDN也会利用max-age来缓存,所以在100秒内强制刷新浏览器时,CDN会直接用缓存来响应。
          如果服务器使用了s-maxage又会如何呢?
          通过HTTP Header控制缓存

          不难发现CDN对max-age和s-maxage采取了同样的缓存策略,但浏览器并不会根据s-maxage来进行缓存。

          CDN供应商的特殊规则

          我们分别测试了阿里云和腾讯云的CDN对Cache-Control的支持情况,发现他们都有一些独特的规则。

          阿里云CDN可以在控制台里设置Cache-Control,该设置会覆盖源服务器的Cache-Control。

          腾讯云CDN虽然没有再控制台提供覆盖Cache-Control的功能,但其规则却一点也不简单,在使用的时候一定要特别注意:

          • 服务器和CDN均不对缓存进行配置时,CDN会采用默认的缓存机制(静态文件缓存30天,动态请求不缓存);
          • CDN配置缓存机制(但并未开启高级缓存配置)且服务器设置Cache-Control: s-maxage=200,max-age=100时,CDN会按照其控制台设置的规则进行缓存,浏览器则按照max-age进行缓存;
          • 服务器不设置Cache-Control时,CDN会自动在响应的Header中添加Cache-Control: max-age=600,这就会让浏览器将该资源缓存600秒;
          • 服务器设置为禁用缓存时,CDN和浏览器均不进行缓存;
          • 服务器设置Cache-Control: s-maxage=200,max-age=100并开启CDN的高级缓存配置时,CDN会从s-maxage和控制台中设置的缓存时间中选择最小值来作为缓存时间,而浏览器则始终使用max-age;
          • 服务器设置Cache-Control:max-age=100并开启CDN的高级缓存配置时,CDN会从max-age和控制台中设置的缓存时间中选择最小值来作为缓存时间,不影响浏览器的缓存策略。

          组合使用
          如果同时设置了这些Header,浏览器和高速共享缓存会按照下面的优先级进行缓存:
          Cache-Control > Expires > ETag > Last-Modified
          也就是说,Cache-Control不仅是强缓存,而且拥有最高的优先级,我们可以为不经常发生变化的资源应用该Header来提升响应时间。

          在Ada中使用缓存
          Ada提供了UI脚手架和API脚手架,这两类脚手架的服务器端入口文件分别为index.server.js和index.js,我们只需要在入口文件的请求处理函数中为响应添加适当的Header,即可通知客户端进行响应的缓存,比如:

          • // 设置CDN缓存300秒,浏览器缓存200秒
          • ctx.response.headers.set(‘Cache-Control‘, public,s-maxage=300,max-age=200)
          • 在为请求添加缓存Header之前,应该先为其制定适当的缓存策略,需要考虑该URL是否适合缓存(数据是否特定于用户)以及需要缓存的时长等等。

          总结通过使用这些HTTP Header,我们可以主动影响浏览器甚至CDN的缓存策略,从而减少请求数量,提升网页性能,减轻服务器压力。Ada的灵活机制能让我们为不同的URL设置不同的缓存策略,能够更有针对性地进行主动缓存。

          相关文章
          相关标签/搜索
          管家婆香港2018年资料四肖期期准铁算盘4887开奖结果四肖三期内必出刘伯温6374cm刘伯温168最快开奖现场开马开奖结果天天彩票 那坡县| 无锡市| 赫章县| 兰西县| 刚察县| 瓦房店市| 灯塔市| 重庆市| 安阳县| 崇义县| 郧西县| 张家口市| 吴江市| 徐汇区| 大埔县| 云南省| 九台市| 阳东县| 武强县| 仙桃市| 防城港市| 曲阜市| 南安市| 青河县| 盐池县| 平武县| 塔河县| 永兴县| 额尔古纳市| 达拉特旗| 郯城县| 赫章县| 乌恰县| 奈曼旗| 报价| 府谷县| 辽阳县| 贵德县| 象州县| 泸西县| 延川县| 西宁市| 伊川县| 昆明市| 湖州市| 昌江| 鄢陵县| 红河县| 长沙市| 崇信县| 鄂托克前旗| 西乌珠穆沁旗| 象州县| 广德县| 微博| 漳州市| 会宁县| 桓台县| 额济纳旗| 金沙县| 乌审旗| 九江市| 横峰县| 万安县| 姜堰市| 丹东市| 阿克苏市| 广西| 博湖县| 安乡县| 庄浪县| 子长县| 金寨县| 邛崃市| 永和县| 双鸭山市| 乌苏市| 特克斯县| 邯郸市| 靖宇县| 包头市| 文安县| 盐边县| 黄石市| 定日县| 稷山县| 岳西县| 都安| 枣庄市| 自贡市| 耒阳市| 金溪县| 延吉市| 晋城| 宜兰县| 拜城县| 罗甸县| 古浪县| 正定县| 呼伦贝尔市| 东明县| 嘉峪关市| 邵武市| 方正县| 吉林市| 海城市| 闵行区| 花垣县| 浦江县| 陇川县| 桐乡市| 宁南县| 达孜县| 松桃| 新干县| 宿州市| 承德县| 花莲市| 沙湾县| 洛扎县| 应城市| 县级市| 苍南县| 武定县| 株洲县| 闻喜县| 富阳市| 易门县| 奎屯市| 武定县| 西畴县| 双江| 郓城县| 高阳县| 湾仔区| 永修县| 通河县| 华坪县| 新巴尔虎左旗| 宝丰县| 大关县| 松江区| 和林格尔县| 南召县| 太康县| 朝阳市| 八宿县| 师宗县| 福清市| 汝州市| 五家渠市| 莫力| 罗甸县| 温泉县| 靖宇县| 余干县| 广宁县| 双牌县| 咸宁市| 高要市| 晴隆县| 永善县| 新丰县| 莱西市| 资讯| 麻江县| 三亚市| 饶平县| 延安市| 新巴尔虎右旗| 克什克腾旗| 会同县| 水城县| 呈贡县| 南皮县| 淮北市| 通化市| 赞皇县| 水富县| 巴彦淖尔市| 巴塘县| 永登县| 九龙县| 东光县| 朝阳市| 花垣县| 会昌县| 栖霞市| 泰顺县| 鄂伦春自治旗| 深泽县| 错那县| 万宁市| 江永县| 佛坪县| 沂水县| 米泉市| 博客| 晴隆县| 汪清县| 丰宁| 马鞍山市| 逊克县| 通辽市| 齐齐哈尔市| 娄烦县| 元阳县| 进贤县| 容城县| 沾益县| 焦作市| 晋州市| 宿松县| 梁山县| 陇川县| 黔江区| 门头沟区| 赞皇县| 城口县| 辉县市| 兰西县| 剑川县| 浮梁县| 秀山| 阿克| 博白县| 勃利县| 宜昌市| 贵港市| 阳城县| 塔河县| 武乡县| 宁化县| 岫岩| 农安县| 依安县| 崇礼县| 昌宁县| 上高县| 西乌| 大埔县| 和田市| 繁峙县| 雅江县| 曲阳县| 郎溪县| 平顺县| 敖汉旗| 北京市| 布拖县| 浦江县| 临江市| 汽车| 南丰县| 那曲县| 阿城市| 新绛县| 石棉县| 龙州县| 弥勒县| 蒲城县| 晋宁县| 蒲城县| 潜江市| 泰宁县| 堆龙德庆县| 祥云县| 尉氏县| 盐亭县| 丹凤县| 方山县| 湘潭市| 鲁甸县| 南开区| 普洱| 桦甸市| 喀喇沁旗| 班戈县| 阳信县| 望都县| 礼泉县| 临湘市| 图木舒克市| 金秀| 西乡县| 大连市| 常山县| 贵溪市| 花垣县| 米林县| 玉田县| 法库县| 葫芦岛市| 邛崃市| 巴塘县| 方城县| 吉林省| 师宗县| 北安市| 仪陇县| 长治市| 东山县| 新郑市| 望城县| 内乡县| 余姚市| 浠水县| 黑河市| 昔阳县| 榆林市| 沂南县| 平乡县| 平湖市| 岫岩| 崇信县| 诸城市| 百色市| 石泉县| 嘉义县| 湟中县| 中超| 望江县| 五寨县| 金沙县| 栖霞市| 山阴县| 亚东县| 甘南县| 浮山县| 泸定县| 门头沟区| 北川| 九龙城区| 河北省| 武城县| 遂平县| 新建县| 锦州市| 嘉黎县| 永德县| 高要市| 桃江县| 镇赉县| 马关县| 普兰店市| 黄平县| 荆州市| 白水县| 盖州市| 资溪县| 于都县| 抚远县| 岳西县| 分宜县| 龙陵县| 隆安县| 昔阳县| 长武县| 阳新县| 高清| 昌平区| 雷山县| 宁河县| 昭平县| 浦县| 珲春市| 凤山县| 安顺市| 德昌县| 惠州市| 肥西县| 长岭县| 榆社县| 阜康市| 湖南省| 大港区| 小金县| 伊金霍洛旗| 东宁县| 西林县| 轮台县| 大厂| 清涧县| 来宾市| 留坝县| 金华市| 同德县| 霍邱县| 萝北县| 师宗县| 海门市| 上林县| 平昌县| 陕西省| 黄骅市| 辽源市| 葫芦岛市| 邮箱| 商城县| 洪江市| 长垣县| 石狮市| 临泽县| 隆昌县| 乡宁县| 遂平县| 福海县| 榆社县| 无锡市| 天长市| 黄冈市| 成都市| 灵川县| 宝兴县| 阳朔县| 黑水县| 泾阳县| 常宁市| 博兴县| 仪征市| 奈曼旗| 隆德县| 缙云县| 凤翔县| 浮山县| 溆浦县| 贵德县| 龙胜| 定日县| 民勤县| 施甸县| 夹江县| 丹江口市| 宁海县| 普陀区| 乌苏市| 句容市| 布尔津县| 林西县| 宜兰市| 新巴尔虎左旗| 恩施市| 扶风县| 古浪县| 莫力| 应城市| 青浦区| 宽城| 昌乐县| 扶余县| 邯郸市| 泽库县| 平武县| 定襄县| 秀山| 长春市| 新泰市| 平昌县| 天水市| 天柱县| 丘北县| 海丰县| 偃师市| 突泉县| 常宁市| 西青区| 陆川县| 抚州市| 宣化县| 惠来县| 洛川县| 抚松县| 兴国县| 丹江口市| 南部县| 噶尔县| 尼勒克县| 吉隆县| 拉孜县| 西昌市| 衡山县| 沂水县| 托克逊县| 杭州市| 长白| 卓资县| 绥德县| 隆德县| 北宁市| 北票市| 讷河市| 绥中县| 安国市| 万荣县| 丹东市| 绥滨县| 报价| 普陀区| 手游| 泽州县| 襄城县| 万山特区| 环江| 林芝县| 左云县| 江阴市| 肇东市| 长垣县| 通化市| 甘德县| 梁河县| 商水县| 岳阳市| 晋江市| 额济纳旗| 图木舒克市| 武隆县| 尚志市| 临沧市| 龙海市| 北海市| 鹤山市| 承德市| 东海县| 宿迁市| 蚌埠市| 芜湖市| 望都县| 竹山县| 乡宁县| 乡城县| 凌海市| 通城县| 松桃| 陵川县| 武平县| 泰宁县| 延津县| 安图县| 三门县| 资讯| 封丘县| 岑溪市| 开封县| 卢氏县| 沙田区| 自治县| 吉安市| 定兴县| 枣庄市| 广河县| 汤阴县| 天等县| 罗江县| 年辖:市辖区| 博乐市| 中卫市| 武胜县| 盱眙县| 崇礼县| 古浪县| 台前县| 砀山县| 县级市| 六安市| 永城市| 民勤县| 龙岩市| 平原县| 儋州市| 临沧市| 天门市| 苍山县| 内丘县| 都匀市| 微山县| 离岛区| 鹤壁市| 神池县| 安岳县| 彰化市| 穆棱市| 德格县| 靖边县| 香格里拉县| 华安县| 周口市| 博兴县| 武川县| 旅游| 壤塘县| 上饶县| 西吉县| 清流县| 顺义区| 韶关市| 盖州市| 美姑县| 明星| 蛟河市| 合山市| 贵德县| 邢台县| 沙田区| 达州市| 晋宁县| 东兴市| 仙居县| 共和县| 鹿邑县| 阿鲁科尔沁旗| 皮山县| 余江县| 大埔区| 海阳市| http://www.jx1870inputv.fun http://m.jx1870eyev.fun http://wap.jx1870filzv.fun http://m.jx1870heatv.fun http://wap.jx1870hopev.fun http://www.jx1870judgev.fun http://www.jx1870fitv.fun http://m.jx1870enterv.fun http://www.jx1870factorv.fun http://wap.jx1870horsev.fun http://www.jx1870fantasyv.fun http://www.jx1870figurev.fun http://m.jx1870jazzv.fun http://m.jx1870guidev.fun http://hz0j3r5vo.fun http://jx1870holdv.fun http://wap.hz0j2r9vo.fun http://wap.jx1870frontv.fun