通过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设置不同的缓存策略,能够更有针对性地进行主动缓存。

              相关文章
              相关标签/搜索
              香港蓝月亮精选免费资料大全管家婆王中王鉄算盘开奖结果2019开奖记录结果查询香港马会开奖结果历史纪录在线查询 宣化县| 嵊州市| 朔州市| 盐山县| 湟源县| 沛县| 广德县| 天柱县| 顺平县| 茂名市| 宁远县| 鱼台县| 鹿邑县| 余江县| 靖江市| 长治县| 土默特右旗| 临城县| 聊城市| 阳高县| 鸡西市| 怀宁县| 醴陵市| 镇原县| 灵台县| 曲周县| 利津县| 柘荣县| 永仁县| 盘锦市| 南雄市| 革吉县| 高邮市| 陆丰市| 田阳县| 武冈市| 涪陵区| 景洪市| 石景山区| 巴彦淖尔市| 南郑县| 沂源县| 凤城市| 永靖县| 芜湖县| 双牌县| 靖西县| 正宁县| 吉木萨尔县| 望江县| 桦南县| 金塔县| 乐陵市| 永泰县| 荆州市| 青冈县| 藁城市| 德令哈市| 巴中市| 错那县| 东辽县| 政和县| 寿光市| 德州市| 泗阳县| 准格尔旗| 平原县| 新建县| 堆龙德庆县| 察雅县| 南和县| 剑河县| 南召县| 富宁县| 顺平县| 当涂县| 新巴尔虎右旗| 洪江市| 雷山县| 平阴县| 玉山县| 马边| 宽甸| 桂林市| 屏东县| 甘南县| 庆安县| 信宜市| 随州市| 乐山市| 云梦县| 肇东市| 科技| 大埔区| 思茅市| 永定县| 千阳县| 建始县| 大英县| 黎城县| 榆社县| 太仓市| 抚顺市| 延庆县| 巩留县| 广汉市| 隆昌县| 青冈县| 任丘市| 南雄市| 社会| 新泰市| 澄迈县| 南木林县| 泸西县| 云和县| 广昌县| 肇东市| 黄骅市| 仁怀市| 方城县| 沭阳县| 桐梓县| 金湖县| 宝坻区| 镇赉县| 长子县| 南召县| 会同县| 福贡县| 类乌齐县| 清水河县| 景泰县| 皮山县| 仪征市| 新源县| 景德镇市| 仁寿县| 铁岭县| 桓台县| 黔西县| 房山区| 清河县| 星子县| 嵩明县| 海丰县| 新化县| 南昌市| 建昌县| 疏勒县| 浏阳市| 深州市| 建宁县| 鄄城县| 冕宁县| 安宁市| 蓬溪县| 聂拉木县| 广元市| 抚顺县| 新和县| 常宁市| 丰镇市| 陕西省| 谷城县| 横山县| 绥棱县| 察隅县| 邵武市| 会昌县| 中方县| 海南省| 剑阁县| 吴堡县| 恩施市| 巴楚县| 云和县| 清镇市| 宁武县| 丰宁| 潮州市| 玛纳斯县| 贡嘎县| 沂源县| 敦煌市| 永寿县| 岗巴县| 大方县| 兴义市| 兴山县| 公主岭市| 和硕县| 蒙山县| 汉川市| 拜泉县| 隆回县| 循化| 鄂尔多斯市| 沈阳市| 七台河市| 靖江市| 襄樊市| 乐业县| 云霄县| 巴彦淖尔市| 北海市| 南通市| 昌宁县| 孟津县| 治多县| 云和县| 奉新县| 汉寿县| 边坝县| 康乐县| 鄯善县| 咸阳市| 上林县| 休宁县| 伊金霍洛旗| 大洼县| 乃东县| 偃师市| 左云县| 山阳县| 秦皇岛市| 大足县| 翼城县| 华安县| 金沙县| 库尔勒市| 隆子县| 高台县| 英德市| 监利县| 阳高县| 鹤山市| 肇东市| 元阳县| 阳高县| 鲁山县| 龙州县| 同心县| 玉田县| 榆树市| 伊金霍洛旗| 洛扎县| 吉隆县| 洱源县| 佛山市| 清涧县| 建阳市| 文水县| 聂拉木县| 鞍山市| 道真| 环江| 资源县| 塔城市| 云林县| 大埔区| 吴堡县| 藁城市| 自治县| 自治县| 威海市| 丁青县| 顺昌县| 天水市| 电白县| 保定市| 邳州市| 白银市| 浙江省| 淳安县| 洞口县| 开江县| 高要市| 凤台县| 康平县| 应用必备| 麻江县| 民权县| 南和县| 莱西市| 古蔺县| 温宿县| 阿城市| 桦南县| 乡宁县| 东港市| 攀枝花市| 浦县| 酉阳| 临武县| 镇平县| 曲周县| 汤阴县| 中西区| 新沂市| 岳池县| 岫岩| 奇台县| 林芝县| 和田市| 赤城县| 子长县| 普格县| 南汇区| 凤翔县| 信丰县| 古交市| 上高县| 岳阳县| 元朗区| 惠安县| 乃东县| 凤翔县| 榆中县| 定兴县| 满洲里市| 松阳县| 长乐市| 喀喇沁旗| 赣州市| 辉南县| 通州区| 贞丰县| 乾安县| 武隆县| 库尔勒市| 石泉县| 邢台市| 聊城市| 安溪县| 清水河县| 连南| 凤庆县| 竹溪县| 平阳县| 巴青县| 胶州市| 定日县| 禹城市| 黔东| 社会| 札达县| 大石桥市| 德化县| 中江县| 漾濞| 长武县| 普定县| 峨山| 宜宾县| 德安县| 保亭| 正镶白旗| 太和县| 阳原县| 布拖县| 夏河县| 高淳县| 尉氏县| 定南县| 肇源县| 夏邑县| 平江县| 鹿邑县| 长汀县| 平阴县| 凌海市| 永善县| 玉山县| 张北县| 河南省| 行唐县| 南漳县| 海兴县| 东至县| 亳州市| 宝清县| 灵寿县| 惠州市| 武义县| 青冈县| 沙田区| 梁平县| 胶州市| 洛川县| 灵石县| 兖州市| 潼南县| 林芝县| 叶城县| 墨江| 蕉岭县| 垫江县| 电白县| 滕州市| 大石桥市| 江口县| 英德市| 安图县| 绥江县| 永新县| 临洮县| 天台县| 平昌县| 镇赉县| 云安县| 潞城市| 基隆市| 紫云| 浦城县| 吴江市| 汽车| 海南省| 沈丘县| 文水县| 十堰市| 合作市| 通辽市| 绍兴县| 铅山县| 禹城市| 冷水江市| 阆中市| 隆德县| 隆回县| 瑞金市| 平顺县| 若羌县| 昭平县| 黄浦区| 玛曲县| 新民市| 武定县| 辽宁省| 安陆市| 茂名市| 都匀市| 高阳县| 成安县| 和林格尔县| 常宁市| 泌阳县| 济南市| 瓦房店市| 西贡区| 唐山市| 全南县| 华池县| 内丘县| 依安县| 当阳市| 陇南市| 普陀区| 庆元县| 闽侯县| 遂昌县| 金华市| 牡丹江市| 呼玛县| 铅山县| 新乐市| 梁平县| 武义县| 陇南市| 滁州市| 芷江| 嘉义市| 大安市| 延津县| 平远县| 耒阳市| 元江| 休宁县| 彩票| 海口市| 肥城市| 和林格尔县| 新竹市| 灵川县| 扎赉特旗| 景德镇市| 独山县| 梅河口市| 张家港市| 江源县| 舞钢市| 上饶县| 永丰县| 新干县| 新田县| 桐城市| 海淀区| 桂阳县| 会宁县| 茌平县| 深水埗区| 卢湾区| 古浪县| 如东县| 丰顺县| 潮安县| 宁明县| 通道| 奎屯市| 乌拉特前旗| 宣城市| 海原县| 老河口市| 左权县| 高碑店市| 南溪县| 胶州市| 宜兰市| 福建省| 玉树县| 玉田县| 农安县| 肇东市| 团风县| 镇巴县| 盐边县| 上蔡县| 通山县| 泗阳县| 黄骅市| 尼木县| 芮城县| 邵武市| 合山市| 石泉县| 葫芦岛市| 诸城市| 将乐县| 桐乡市| 济宁市| 石门县| 澄迈县| 靖西县| 新乡县| 达尔| 铁岭县| 钟山县| 托克托县| 贺州市| 太原市| 九台市| 汝南县| 蓝山县| 昭平县| 达州市| 姚安县| 大英县| 天台县| 铁岭县| 昭通市| 五家渠市| 墨脱县| 桑日县| 九江县| 油尖旺区| 满城县| 武穴市| 贵港市| 正宁县| 勃利县| 宜春市| 漳平市| 穆棱市| 开原市| 深州市| 广饶县| 临泉县| 军事| 长乐市| 孟村| 长乐市| 谢通门县| 柳林县| 礼泉县| 吉木萨尔县| 平果县| 三原县| 巴林左旗| SHOW| 鹿泉市| 阿克陶县| 德钦县| 宣威市| 奉新县| 绍兴市| 名山县| 洛川县| 博客| 大港区| 云梦县| 邵阳市| 靖远县| 宜兰市| 武功县| 青铜峡市| 柳河县| 贵溪市| 陵川县| 康马县| 公主岭市| 凤庆县| 城口县| 精河县| 大石桥市| 琼海市| http://wap.jx1870huzorv.fun http://www.jx1870fallv.fun http://m.jx1870labelv.fun http://www.hz0j2r9vo.fun http://www.jx1870figurev.fun http://wap.jx1870fallv.fun http://www.jx1870groupv.fun http://m.hz0j2r0vo.fun http://www.jx1870frazev.fun http://hz0j0r7vo.fun http://www.jx1870furtherv.fun http://www.jx1870kitv.fun http://www.jx1870growv.fun http://www.jx1870gradev.fun http://wap.jx1870guaranteev.fun http://wap.jx1870jackv.fun http://jx1870hirev.fun http://jx1870evenv.fun