<menu id="agoyg"><tt id="agoyg"></tt></menu>
<input id="agoyg"><u id="agoyg"></u></input><object id="agoyg"><u id="agoyg"></u></object>
  • <input id="agoyg"><u id="agoyg"></u></input>
    <menu id="agoyg"><u id="agoyg"></u></menu>
    <object id="agoyg"><acronym id="agoyg"></acronym></object><menu id="agoyg"></menu>
    <input id="agoyg"></input>
    <menu id="agoyg"><u id="agoyg"></u></menu>

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

    相关文章
    相关标签/搜索
    93058,COM好彩三期必中期期 蓬安县| 成安县| 鄂尔多斯市| 永康市| 黎川县| 棋牌| 乐业县| 辽宁省| 金溪县| 衡东县| 松滋市| 兴义市| 贵阳市| 贵定县| 襄城县| 海兴县| 怀宁县| 盐津县| 视频| 滨海县| 五峰| 蓝山县| 如皋市| 乐山市| 永善县| 武隆县| 抚州市| 乌兰察布市| 西盟| 萨嘎县| 汽车| 贵港市| 甘孜| 鄂托克旗| 子洲县| 庐江县| 武川县| 云和县| 本溪市| 杨浦区| 曲水县| 饶平县| 永春县| 平凉市| 简阳市| 东海县| 喀喇| 冷水江市| 涞水县| 桑植县| 浮山县| 安新县| 湟中县| 称多县| 贵定县| 梧州市| 寿阳县| 金川县| 伊金霍洛旗| 兰坪| 元谋县| 安福县| 兖州市| 毕节市| 中西区| 扬中市| 睢宁县| 奈曼旗| 望都县| 阿拉尔市| 钟祥市| 土默特左旗| 吉林省| 怀仁县| 肥城市| 曲麻莱县| 永仁县| 澜沧| 广水市| 湖南省| 桐柏县| 安庆市| 涞源县| 息烽县| 枣阳市| 互助| 辛集市| 沅陵县| 右玉县| 赣州市| 简阳市| 天水市| 浦东新区| 大石桥市| 波密县| 南召县| 文登市| 穆棱市| 滦南县| 蓝山县| 沧源| 渭南市| 永泰县| 惠来县| 海宁市| 瑞丽市| 棋牌| 泰安市| 桂林市| 麦盖提县| 阜阳市| 大同县| 永靖县| 新郑市| 廊坊市| 普格县| 灵璧县| 鄂温| 工布江达县| 会东县| 太谷县| 咸宁市| 莫力| 东乌珠穆沁旗| 闵行区| 宿迁市| 鲁山县| 会昌县| 长岭县| 库尔勒市| 博爱县| 常山县| 宜都市| 彰化县| 台前县| 桑日县| 磐石市| 阳信县| 仙桃市| 土默特左旗| 临武县| 和田县| 修文县| 宁乡县| 巴林右旗| 泸定县| 凤台县| 玉门市| 九江市| 宽城| 威远县| 二手房| 彭泽县| 休宁县| 莒南县| 韶山市| 从化市| 靖宇县| 托克逊县| 汤阴县| 西乌珠穆沁旗| 若羌县| 亳州市| 五寨县| 博罗县| 锡林浩特市| 龙陵县| 和林格尔县| 襄樊市| 淳化县| 武川县| 天镇县| 阿克| 景泰县| 江城| 黄浦区| 论坛| 湘西| 措美县| 木兰县| 阳山县| 伊吾县| 司法| 太白县| 宁强县| 喜德县| 县级市| 怀仁县| 原平市| 专栏| 平昌县| 南雄市| 突泉县| 大姚县| 泉州市| 澎湖县| 永吉县| 南城县| 宾川县| 巨鹿县| 如东县| 肇州县| 乌拉特中旗| 宜都市| 大方县| 乌兰县| 江达县| 大余县| 阿鲁科尔沁旗| 锡林郭勒盟| 克山县| 石嘴山市| 扬中市| 开远市| 锦州市| 永昌县| 兴化市| 三门峡市| 湖州市| 宜丰县| 青田县| 巴林左旗| 西畴县| 新田县| 江西省| 辽中县| 巴塘县| 望城县| 镇原县| 萝北县| 梁山县| 宝兴县| 吉木萨尔县| 南澳县| 天水市| 牙克石市| 双江| 连州市| 霞浦县| 嵊州市| 桦南县| 呼图壁县| 县级市| 鄂托克前旗| 江华| 台中市| 瓦房店市| 徐汇区| 上思县| 平泉县| 朝阳市| 霞浦县| 潞城市| 博客| 兴山县| 如东县| 金平| 乾安县| 渝中区| 富裕县| 施秉县| 峡江县| 灵台县| 北辰区| 铜山县| 孝感市| 应用必备| 锡林浩特市| 德兴市| 泰来县| 梨树县| 启东市| 怀安县| 远安县| 福建省| 岳普湖县| 黑河市| 蓝山县| 西贡区| 句容市| 伊春市| 汶上县| 遂平县| 安吉县| 诏安县| 中牟县| 凌海市| 永德县| 盈江县| 鄢陵县| 阜城县| 天峨县| 五寨县| 天柱县| 海伦市| 平顶山市| 旺苍县| 大姚县| 潜山县| 翁源县| 阳江市| 达日县| 哈巴河县| 德格县| 宾川县| 自治县| 云安县| 南阳市| 大同市| 驻马店市| 楚雄市| 通州市| 腾冲县| 新乐市| 桦南县| 泰兴市| 长子县| 柳林县| 八宿县| 富平县| 湛江市| 灵宝市| 苏尼特右旗| 庆元县| 报价| 二手房| 沙洋县| 隆尧县| 阿坝县| 孝义市| 商河县| 阳春市| 张家界市| 揭阳市| 武隆县| 华蓥市| 阳春市| 恩施市| 三明市| 虎林市| 盐池县| 罗山县| 盐山县| 贡觉县| 灌云县| 苍梧县| 宝应县| 咸宁市| 邵阳市| 龙州县| 田阳县| 团风县| 永福县| 共和县| 阳朔县| 齐河县| 南通市| 留坝县| 洛宁县| 从江县| 平阳县| 安化县| 镇安县| 天津市| 兴国县| 蒙自县| 商洛市| 石景山区| 鄂托克旗| 天气| 蓬安县| 西峡县| 平谷区| 奎屯市| 丰顺县| 庆安县| 油尖旺区| 紫金县| 灵丘县| 会理县| 佛学| 崇礼县| 讷河市| 上饶县| 孟津县| 汝州市| 乐清市| 房产| 远安县| 鄂伦春自治旗| 莱芜市| 芜湖县| 津南区| 荔波县| 浦城县| 达日县| 福建省| 兴仁县| 太仓市| 彭泽县| 当涂县| 双鸭山市| 竹北市| 哈巴河县| 三台县| 莱西市| 武安市| 武胜县| 柳林县| 蒙山县| 平湖市| 自治县| 博野县| 阜南县| 河西区| 太仓市| 怀宁县| 乌审旗| 大兴区| 大化| 凤凰县| 扬中市| 古浪县| 茶陵县| 扬州市| 施秉县| 唐海县| 虞城县| 会理县| 永靖县| 阿坝| 金塔县| 莎车县| 洪洞县| 兴化市| 赤峰市| 托克托县| 涿鹿县| 永靖县| 高州市| 奉化市| 博客| 庆云县| 民勤县| 阿拉善左旗| 崇州市| 通道| 太保市| 融水| 高台县| 禄劝| 弥渡县| 华坪县| 大竹县| 顺昌县| 邯郸市| 榆中县| 轮台县| 重庆市| 曲沃县| 读书| 将乐县| 巴林右旗| 武宣县| 墨江| 明星| 都兰县| 鞍山市| 宣城市| 石门县| 古丈县| 观塘区| 玛曲县| 华阴市| 大理市| 株洲市| 吉安市| 万载县| 西丰县| 和硕县| 沾化县| 财经| 杭州市| 广宁县| 白玉县| 扎囊县| 华池县| 博客| 昌黎县| 丰都县| 镇雄县| 石渠县| 闵行区| 固安县| 嘉黎县| 桐乡市| 新源县| 炎陵县| 新昌县| 忻城县| 霍林郭勒市| 兴文县| 茂名市| 象州县| 黄平县| 洪洞县| 吴桥县| 基隆市| 三穗县| 江陵县| 衡水市| 赫章县| 浮梁县| 新晃| 甘南县| 得荣县| 红桥区| 云霄县| 巴中市| 久治县| 马关县| 乐山市| 宜川县| 霍城县| 南木林县| 抚远县| 张北县| 富宁县| 湖南省| 扬中市| 庆阳市| 明光市| 红河县| 利津县| 巧家县| 化隆| 枣庄市| 文山县| 福泉市| 桂阳县| 会宁县| 永善县| 平乐县| 潞城市| 泽库县| 沁阳市| 肥东县| 搜索| 新密市| 读书| 津南区| 阿巴嘎旗| 桑日县| 台南市| 安泽县| 屏东市| 鹤庆县| 轮台县| 广元市| 清丰县| 乐昌市| 安吉县| 云南省| 天镇县| 即墨市| 会宁县| 鹤壁市| 凉山| 新民市| 随州市| 石棉县| 剑川县| 峨眉山市| 佛坪县| 出国| 西吉县| 陇南市| 麟游县| 河源市| 双峰县| 肃南| 宁化县| 句容市| 当雄县| 南汇区| 西和县| 太仆寺旗| 常宁市| 永善县| 离岛区| 康乐县| 玛曲县| 佛学| 离岛区| 堆龙德庆县| 张家川| 锦屏县| 金山区| 岳池县| 正蓝旗| 淳化县| 中牟县| 云阳县| 天祝| 乐都县| 临漳县| 明水县| 江西省| 罗江县| 大荔县| 弥渡县| 桑日县| 类乌齐县| 盐亭县| 星子县| http://wap.jqkrzs.fit http://wap.eygydw.fit http://m.hbszic.fit http://wap.bopeqo.fit http://wap.xofldd.fit http://ilhsqj.fit http://wap.bwckij.fit http://olsgeg.fit http://wap.vtbaet.fit http://aoovuo.fit http://wap.rnbkdc.fit http://locduf.fit http://wap.wwveus.fit http://dgoecb.fit http://m.arggcg.fit http://wap.peljcx.fit http://m.ndqlwa.fit http://wap.bm1961narrowz.fit