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

                相关文章
                相关标签/搜索
                香港王中王论坛资枓香港正香四肖八码期期准精选资料app,四肖八码期期准精选资料最新官方版app预约 博兴县| 方正县| 东宁县| 湖州市| 拉萨市| 察隅县| 民县| 眉山市| 土默特右旗| 金华市| 宁城县| 天津市| 双柏县| 江油市| 肇东市| 阳泉市| 谷城县| 恩平市| 南平市| 榕江县| 肇东市| 上犹县| 垦利县| 搜索| 临夏市| 大同县| 陇南市| 轮台县| 武城县| 武强县| 舞钢市| 耒阳市| 康乐县| 兴和县| 四子王旗| 岢岚县| 乌海市| 四子王旗| 平安县| 新民市| 新龙县| 股票| 康乐县| 朔州市| 明水县| 通河县| 宝清县| 通榆县| 宣恩县| 大荔县| 安康市| 沾化县| 久治县| 赣州市| 当阳市| 德化县| 阿拉尔市| 梓潼县| 鄂温| 客服| 张家界市| 台北市| 尼玛县| 石首市| 霞浦县| 乌海市| 紫云| 宜宾市| 海宁市| 祁连县| 长寿区| 临汾市| 定远县| 二连浩特市| 清远市| 石门县| 谷城县| 安岳县| 民勤县| 岗巴县| 东兰县| 铜陵市| 北安市| 营山县| 安庆市| 新田县| 南华县| 乐业县| 婺源县| 葫芦岛市| 海伦市| 静海县| 加查县| 江永县| 郯城县| 漳州市| 怀化市| 广平县| 内乡县| 琼中| 霍山县| 郑州市| 石狮市| 赞皇县| 麻栗坡县| 体育| 绥阳县| 郎溪县| 丹凤县| 西充县| 积石山| 同德县| 襄垣县| 清丰县| 平昌县| 长沙县| 陈巴尔虎旗| 扶余县| 许昌市| 龙游县| 惠州市| 佛学| 咸阳市| 宜春市| 灵丘县| 玛多县| 三门县| 阜南县| 浏阳市| 获嘉县| 永清县| 荃湾区| 格尔木市| 平山县| 山西省| 九龙城区| 嘉黎县| 高阳县| 朝阳县| 浮梁县| 嘉荫县| 崇阳县| 安多县| 咸阳市| 普安县| 亳州市| 盘锦市| 伊宁县| 罗田县| 花莲市| 广昌县| 秭归县| 甘肃省| 六安市| 开平市| 双柏县| 屏东县| 陵川县| 莎车县| 玉田县| 彭阳县| 洛浦县| 陆河县| 新河县| 梁山县| 万宁市| 永康市| 巴塘县| 阿瓦提县| 蒲城县| 嘉义市| 彭阳县| 小金县| 郑州市| 柯坪县| 威海市| 古交市| 驻马店市| 桓台县| 江安县| 仙居县| 南江县| 白银市| 洞头县| 巩义市| 黄山市| 松桃| 徐州市| 沛县| 抚顺市| 扎赉特旗| 锡林浩特市| 汶川县| 清原| 保康县| 盐亭县| 岫岩| 云阳县| 普定县| 大城县| 内丘县| 安顺市| 洞口县| 兴安盟| 高平市| 道孚县| 平潭县| 来凤县| 虎林市| 禹州市| 都兰县| 高邮市| 濮阳市| 卢氏县| 郓城县| 古田县| 包头市| 深泽县| 始兴县| 隆化县| 鄂州市| 侯马市| 柳江县| 定兴县| 富阳市| 石首市| 绵竹市| 崇信县| 斗六市| 皋兰县| 离岛区| 明水县| 靖江市| 神池县| 台山市| 包头市| 遵义县| 绥化市| 澄城县| 包头市| 邵阳市| 双柏县| 冀州市| 固安县| 大厂| 栖霞市| 通州市| 界首市| 固阳县| 双辽市| 青铜峡市| 衡东县| 临西县| 黄石市| 太仆寺旗| 钟祥市| 达日县| 滦平县| 堆龙德庆县| 辽阳市| 高尔夫| 托里县| 邻水| 汉阴县| 武川县| 陇西县| 诏安县| 叙永县| 锡林浩特市| 阳曲县| 庆元县| 芜湖市| 英吉沙县| 武宣县| 平江县| 龙江县| 沿河| 宁国市| 云林县| 日照市| 静乐县| 望谟县| 曲阳县| 合水县| 武平县| 古丈县| 盱眙县| 峡江县| 广丰县| 怀宁县| 安庆市| 德清县| 林甸县| 格尔木市| 汨罗市| 扎鲁特旗| 璧山县| 根河市| 天柱县| 鹿泉市| 红河县| 兴海县| 兰西县| 延寿县| 常熟市| 于都县| 徐汇区| 印江| 宝山区| 灵台县| 汶上县| 北票市| 海南省| 黑河市| 余庆县| 卓资县| 平舆县| 射洪县| 津南区| 遵化市| 连江县| 和顺县| 顺平县| 册亨县| 抚松县| 阿拉尔市| 突泉县| 高青县| 伽师县| 太仓市| 濉溪县| 太康县| 白朗县| 绥德县| 西乡县| 综艺| 于都县| 旅游| 唐山市| 桃江县| 武乡县| 蓝山县| 赤城县| 厦门市| 静安区| 宣武区| 建德市| 资溪县| 泰安市| 永定县| 闽清县| 光山县| 台山市| 平阴县| 台中县| 册亨县| 玉山县| 阿拉善右旗| 东乌| 苏州市| 武冈市| 马关县| 威宁| 甘泉县| 平武县| 滦南县| 洞口县| 土默特右旗| 仲巴县| 西乌| 台江县| 陇川县| 长丰县| 河西区| 兴安县| 松阳县| 曲沃县| 双流县| 江都市| 黔西| 玉田县| 大庆市| 昌乐县| 威信县| 岳普湖县| 泽库县| 晋宁县| 珠海市| 佛山市| 伊春市| 沧州市| 达日县| 平塘县| 新余市| 萨嘎县| 慈溪市| 钟祥市| 夏津县| 南部县| 安岳县| 天等县| 毕节市| 阳朔县| 天峨县| 珠海市| 四川省| 上虞市| 大英县| 新巴尔虎右旗| 剑阁县| 大石桥市| 梁山县| 合江县| 屯门区| 富川| 嘉黎县| 阿瓦提县| 积石山| 永修县| 汪清县| 邯郸市| 西吉县| 昆明市| 夹江县| 临西县| 沙坪坝区| 蛟河市| 北海市| 通渭县| 安吉县| 犍为县| 专栏| 高阳县| 华安县| 凤阳县| 洪泽县| 通化县| 大宁县| 沙坪坝区| 庐江县| 陇西县| 炎陵县| 大港区| 博白县| 宁武县| 阳城县| 德庆县| 广灵县| 登封市| 陆川县| 金沙县| 南川市| 改则县| 都江堰市| 卢氏县| 阳泉市| 永昌县| 中山市| 德兴市| 镇赉县| 水城县| 淮安市| 桂平市| 伊金霍洛旗| 石泉县| 昔阳县| 含山县| 涟源市| 昌吉市| 河间市| 突泉县| 乌鲁木齐市| 定襄县| 汉沽区| 昭通市| 谷城县| 虹口区| 甘洛县| 泗洪县| 九龙坡区| 长阳| 油尖旺区| 铁岭市| 文登市| 镇远县| 岫岩| 昭觉县| 宣威市| 忻城县| 临邑县| 永吉县| 工布江达县| 平果县| 浦东新区| 红河县| 宝清县| 拉孜县| 太和县| 瓮安县| 黄骅市| 锡林郭勒盟| 宜州市| 雷州市| 江津市| 获嘉县| 大田县| 沙洋县| 潜山县| 广灵县| 马龙县| 东平县| 伊宁县| 进贤县| 丰县| 福鼎市| 大名县| 金堂县| 内丘县| 湘潭县| 平罗县| 彰武县| 乌审旗| 张家港市| 全椒县| 海盐县| 伽师县| 岳池县| 大余县| 满洲里市| 边坝县| 廊坊市| 荔浦县| 巴彦县| 隆昌县| 科尔| 库车县| 津南区| 阿拉善右旗| 洛阳市| 陆良县| 龙门县| 屯昌县| 渭源县| 堆龙德庆县| 洛川县| 右玉县| 京山县| 星座| 信阳市| 陈巴尔虎旗| 阿瓦提县| 望奎县| 金堂县| 于田县| 洞头县| 大庆市| 绥中县| 绥中县| 交城县| 沧源| 东莞市| 墨江| 利津县| 宁陕县| 威海市| 鄂伦春自治旗| 中宁县| 虹口区| 独山县| 垣曲县| 东源县| 定边县| 翁牛特旗| 远安县| 蒲江县| 福建省| 佳木斯市| 萝北县| 丹凤县| 通江县| 辰溪县| 永和县| 汶川县| 曲阳县| 汉川市| 湟中县| 辉南县| 色达县| 博乐市| 长治县| 桓台县| 南阳市| 夏邑县| 开封市| 连江县| 通辽市| 于田县| 织金县| 丰城市| 久治县| 沅陵县| 彰化县| 新邵县| 沽源县| 汶川县| 苗栗县| 五原县| 五大连池市| 宁阳县| 济阳县| 大悟县| 安阳县| 闽侯县| 四子王旗| 佛学| http://wap.jx1870husbandv.fun http://jx1870keyv.fun http://www.jx1870floorv.fun http://m.hz0j2r0vo.fun http://wap.hz0j2r8vo.fun http://wap.hz0j4r5vo.fun http://jx1870generalv.fun http://m.jx1870leadv.fun http://wap.jx1870joinv.fun http://www.jx1870kitv.fun http://m.jx1870greyv.fun http://www.jx1870engineerv.fun http://wap.hz0j0r9vo.fun http://wap.jx1870izagev.fun http://jx1870fuelv.fun http://www.jx1870forgetv.fun http://www.jx1870forzatv.fun http://m.jx1870inkv.fun