<small id="yahdu"></small>

    1. <mark id="yahdu"></mark>

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

      相关文章
      相关标签/搜索
      4887铁算盘四肖中特香港马会开码结果直播 开奖结果-香港最快开奖现场直播-王中王资料 一肖中特-2018年管家婆彩图 今天-王中王中特网资料大全 白小姐 民权县| 莆田市| 荔浦县| 金湖县| 五寨县| 鄯善县| 甘肃省| 建始县| 定兴县| 谷城县| 西盟| 潮州市| 徐汇区| 平邑县| 墨竹工卡县| 东乡族自治县| 阿瓦提县| 沂南县| 临清市| 聊城市| 公安县| 汾西县| 莎车县| 盘锦市| 大埔区| 邹城市| 综艺| 平舆县| 即墨市| 新龙县| 灵台县| 阿拉尔市| 绥宁县| 五华县| 宜兴市| 怀安县| 宽甸| 手游| 隆子县| 盖州市| 台山市| 永仁县| 牙克石市| 呼图壁县| 保山市| 行唐县| 务川| 东阳市| 郎溪县| 乌海市| 昂仁县| 屯昌县| 保靖县| 玉林市| 南汇区| 白水县| 凤阳县| 平陆县| 阳春市| 常宁市| 惠东县| 绥江县| 井研县| 北流市| 淮滨县| 贵州省| 邵东县| 喀喇沁旗| 贵溪市| 河西区| 田阳县| 义乌市| 天柱县| 专栏| 拜城县| 射阳县| 芦溪县| 株洲市| 丰都县| 喜德县| 南溪县| 县级市| 桑植县| 扎鲁特旗| 阜南县| 内丘县| 德钦县| 启东市| 塔城市| 济阳县| 旬邑县| 广宗县| 宁晋县| 砀山县| 蒙山县| 遵义市| 盐池县| 曲麻莱县| 荔波县| 南通市| 棋牌| 响水县| 白河县| 芜湖市| 海城市| 高要市| 纳雍县| 泰宁县| 宾阳县| 永登县| 延寿县| 梧州市| 镇雄县| 柳江县| 泗洪县| 长治市| 武乡县| 镇雄县| 四子王旗| 钟山县| 浦城县| 砚山县| 进贤县| 潼南县| 临西县| 嘉定区| 东明县| 石渠县| 塔城市| 手游| 广德县| 响水县| 沁源县| 福贡县| 高安市| 朔州市| 遂溪县| 报价| 湘阴县| 景谷| 裕民县| 保德县| 台安县| 曲阜市| 牟定县| 秭归县| 利津县| 本溪市| 方山县| 晋宁县| 洞口县| 承德市| 济阳县| 台东县| 泰来县| 武冈市| 新津县| 乌鲁木齐县| 德化县| 唐河县| 大冶市| 上林县| 定安县| 万州区| 肥城市| 吴江市| 大宁县| 抚宁县| 沾益县| 新建县| 迭部县| 松江区| 溆浦县| 宜宾县| 高雄市| 溧阳市| 阳西县| 聂荣县| 黑水县| 邵阳市| 开平市| 确山县| 聊城市| 鄱阳县| 抚宁县| 水城县| 濮阳县| 屏东市| 新乡县| 清水县| 庆安县| 横峰县| 辰溪县| 增城市| 罗江县| 深水埗区| 八宿县| 丹凤县| 宁陕县| 蓬莱市| 汶上县| 寿阳县| 阿合奇县| 湖州市| 习水县| 道真| 津南区| 孝感市| 聂荣县| 疏勒县| 鄂托克旗| 阜新市| 长海县| 嘉峪关市| 龙里县| 宜川县| 凤冈县| 鹰潭市| 广灵县| 威信县| 西丰县| 靖边县| 来安县| 昭觉县| 五家渠市| 东丰县| 峡江县| 琼结县| 新乐市| 盐山县| 西和县| 花莲市| 子洲县| 都昌县| 大港区| 琼结县| 大丰市| 华坪县| 平山县| 余江县| 玉溪市| 永定县| 北海市| 阿尔山市| 岱山县| 东莞市| 阆中市| 黄陵县| 韩城市| 家居| 峨眉山市| 峨眉山市| 布拖县| 攀枝花市| 祁门县| 汽车| 宁都县| 怀宁县| 福海县| 南城县| 临桂县| 太保市| 凤阳县| 平顶山市| 社旗县| 东平县| 颍上县| 宁阳县| 阳东县| 淮滨县| 福鼎市| 武川县| 宁明县| 无锡市| 榆林市| 阿鲁科尔沁旗| 迭部县| 金寨县| 彭州市| 玉田县| 辽阳市| 莱芜市| 菏泽市| 云南省| 元朗区| 酉阳| 乡城县| 南昌市| 邢台县| 文山县| 洪雅县| 龙泉市| 金塔县| 潜江市| 台东县| 连江县| 略阳县| 怀柔区| 山东省| 万源市| 双流县| 汝南县| 金寨县| 太原市| 塔城市| 漯河市| 隆尧县| 习水县| 台前县| 克山县| 开远市| 镇宁| 关岭| 曲麻莱县| 专栏| 鸡东县| 垦利县| 湖南省| 会同县| 成都市| 万州区| 大邑县| 林口县| 棋牌| 河南省| 娄烦县| 林芝县| 获嘉县| 珲春市| 策勒县| 聊城市| 乌鲁木齐县| 南岸区| 浪卡子县| 乌鲁木齐市| 永仁县| 延川县| 大姚县| 彝良县| 高州市| 资溪县| 永吉县| 锦州市| 保亭| 庆元县| 竹北市| 大邑县| 湘潭县| 翁牛特旗| 巢湖市| 甘孜县| 尚志市| 古丈县| 琼结县| 康乐县| 新竹市| 油尖旺区| 渭源县| 宝兴县| 遂平县| 象山县| 乌鲁木齐县| 南开区| 毕节市| 耒阳市| 南投县| 商丘市| 司法| 文成县| 鹤山市| 湛江市| 株洲县| 古蔺县| 望谟县| 香格里拉县| 淮南市| 阜宁县| 锦州市| 鄯善县| 高州市| 密云县| 雅江县| 黄浦区| 卓尼县| 即墨市| 西安市| 承德市| 唐河县| 开平市| 墨竹工卡县| 汉沽区| 花莲市| 航空| 元阳县| 六枝特区| 琼海市| 响水县| 财经| 新野县| 怀柔区| 都江堰市| 吉林市| 怀柔区| 海南省| 页游| 依兰县| 武冈市| 西乡县| 万全县| 扶绥县| 盐源县| 六盘水市| 吉首市| 崇阳县| 辉县市| 泗阳县| 大荔县| 新田县| 安溪县| 襄垣县| 南岸区| 抚宁县| 全椒县| 宣威市| 房山区| 辽阳县| 韩城市| 平谷区| 赣榆县| 武川县| 聊城市| 寻乌县| 磐安县| 陵川县| 资中县| 金溪县| 河津市| 阆中市| 巴彦淖尔市| 灵台县| 华安县| 开阳县| 密云县| 建平县| 卢湾区| 乐安县| 浮梁县| 黑山县| 定远县| 太湖县| 滨海县| 和龙市| 满洲里市| 紫阳县| 绵阳市| 桐城市| 民勤县| 铜鼓县| 邯郸市| 偃师市| 柏乡县| 铜山县| 临朐县| 永胜县| 鹿泉市| 丰县| 阿拉善右旗| 安远县| 泸溪县| 南漳县| 孝昌县| 海阳市| 信丰县| 历史| 兖州市| 宣城市| 镇原县| 武宁县| 前郭尔| 金乡县| 高淳县| 长沙县| 册亨县| 玛纳斯县| 汉沽区| 津南区| 延长县| 株洲市| 平阴县| 忻城县| 明水县| 新绛县| 平安县| 惠州市| 牙克石市| 墨脱县| 华容县| 融水| 芮城县| 凌云县| 镇原县| 余姚市| 安仁县| 赤水市| 普安县| 赤水市| 涟源市| 慈利县| 蓬莱市| 辽阳市| 台北市| 富宁县| 丹巴县| 张家港市| 彭阳县| 诸暨市| 无极县| 长垣县| 息烽县| 华亭县| 晋州市| 综艺| 太保市| 白城市| 睢宁县| 满洲里市| 乌拉特后旗| 武义县| 乌鲁木齐县| 康乐县| 双流县| 永和县| 祁东县| 台中县| 富裕县| 随州市| 榆林市| 泽库县| 磴口县| 勃利县| 南阳市| 仁怀市| 峨眉山市| 安塞县| 金阳县| 珠海市| 上饶县| 溧水县| 天长市| 报价| 文登市| 繁峙县| 保亭| 东平县| 牟定县| 萝北县| 浏阳市| 乡城县| 察隅县| 绵阳市| 东兴市| 社旗县| 海宁市| 肇庆市| 洪泽县| 彭水| 松溪县| 南宫市| 东安县| 北票市| 会理县| 张家口市| 九龙坡区| 寿宁县| 大渡口区| 平顺县| 怀宁县| 滕州市| 许昌县| 莱州市| 阳谷县| 滨州市| 进贤县| 龙井市| 宁海县| 凉山| 揭西县| 青岛市| 怀安县| 湛江市| 垣曲县| 高要市| 伊吾县| 晋中市| 东丰县| 东至县| 铜梁县| 修文县| 柞水县| 绥江县| 洛扎县| 志丹县| 临沧市| 西青区| 忻城县| 含山县| 丘北县| 佳木斯市| 瓮安县| 清流县| 宁陕县| 嘉善县| 扶绥县| 北票市| 邻水| http://www.dgoecb.fit http://wap.japcoc.fit http://wap.nasnnn.fit http://wogsmb.fit http://m.nhumkz.fit http://www.higlnf.fit http://wap.hhgdkl.fit http://www.dkbnwe.fit http://wap.auffxs.fit http://m.psevui.fit http://fwgjwa.fit http://www.jufgvx.fit http://m.maxhto.fit http://www.hqmibq.fit http://wap.dxgjcc.fit http://bm1961xinez.fit http://m.opogzd.fit http://wap.pvyrtc.fit