有时,当第二次访问网站时,看起来比较怪,样式不正常。

通常,是因为 cache control 缓存控制策略定义不正确,导致服务端最新部署之后客户端没有接收到最新的更改。

本文将向您展示正确的缓存设置,以便在每次部署后使所有用户的网站保持最新状态。

缓存在后台如何工作?

浏览器为了提高性能,向服务器请求资源时,都尽量多从本地缓存获取,尽量少从服务器获取。

具体行为我们可以通过指令来控制,通过设置 HTTP 响应头来实现。

缓存处理相关的最常用指令包括:

  • Cache-Control
  • Expires
  • Etag
  • Last-Modified

如果没有设置缓存控制指令,浏览器将从服务器获取每个资源,这会增加页面的加载时间。

没有缓存设置的请求流程:

由浏览器决定如何在没有服务器指示的情况下缓存信息。

不同浏览器策略不同,例如 Chrome 和 Safari 每次都从后端下载数据。

为了清楚地定义缓存的处理方式,让我们深入了解一下缓存控制指令。

Etag(实体标签)

Etag 可以让我们在不用下载资源的情况下,就知道服务器上的资源是否变更了。

服务器在给浏览器发送资源文件时(例如 css 文件),会对此资源内容计算出一个 hash 值,作为此文件的 tag,一起发送给浏览器。

浏览器下次请求此资源文件时,先把这个 tag 发给服务器,HTTP header 信息例如:

If-None-Match: W/“1d2e7–1648e509289”

服务器和本地文件的 hash 值对比。

如果一样,就告诉浏览器没有变化,可以使用缓存文件,否则浏览器下载新文件。

使用Etag请求流-第一次加载:

使用Etag请求流-第二次加载:

启用 Etag 缓存策略后,我们总是会去服务器检查文件的哈希值,然后浏览器才会决定从缓存中提取文件或将其完全加载。

如果未修改,则无论您要请求的是10KB还是10MB的文件,只需80–100字节即可进行验证。

Last Modified

服务器有每个文件的最后修改时间戳,在第一次文件加载之后,客户端会向服务器询问此文件在某时间之后是否更改过。

HTTP header 信息例如:

If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT

如果改了,就下载新文件,否则使用缓存。

看着挺好,但现实情况并不一定是这样的,“Last-Modified” 是一个弱缓存头信息,浏览器有自己的缓存策略,会自行决定是否从缓存中获取资源或下载新文件,不同浏览器处理方式也不一样。

使用 Last-Modified 的请求流程 - 第一次加载:

使用 Last-Modified 的请求流程 - 第二次加载(完美情况):

使用 Last-Modified 的请求流程 - 第二次加载(通常情况):

所以,“Last-Modified” 是不可靠的,我宁愿完全不使用他。

Cache-Control max-age

这个指令告诉浏览器此文件在本地缓存多长时间。

以秒为单位,形式为:

Cache-Control: max-age=31536000

使用此策略后,浏览器完全不用向服务器发起请求了,直接使用本地缓存,非常快。

但是,没有办法确保这段时间内服务器中的文件不会修改。

因此,为了让浏览器下载最新的文件,我们可以使用一些构建工具,例如 Webpack、Gulp。

每个文件都在服务器中进行预编译,对文件内容进行 hash 计算,把 hash 值添加到文件名中,例如 “app-72420c47cc.css”。

这样,文件内容的变化就可以反应在文件名上,对浏览器来讲就是一个新的文件,旧文件的缓存也就没有了,会从服务器上获取新的。

这个方法适用于 CSS JS 和图片文件。

no-cache

no-cache(无缓存)不意味着根本没有缓存,它只是告诉浏览器在使用缓存之前先验证服务器上的资源。

需要与 Etag 一起使用,因此浏览器将发送一个简单请求并加载额外的80个字节以验证文件的状态。

对于 HTML 文件,就需要使用 “no-cache”。

最终方案

使用 Gulp,Webpack 这类工具将唯一的哈希值添加到 css,js 和图像文件(如app-67ce7f3483.css)。

对于 js,css 和图像文件,设置 Cache-Control:public,max-age = 31536000,不设置 Etag 和 Last-Modified。

对于 HTML 文件,设置 Cache-Control: no-cache 和 Etag。

翻译整理自:

https://medium.com/pixelpoint/best-practices-for-cache-control-settings-for-your-website-ff262b38c5a20

cache-control_网站 cache control 最佳实践相关推荐

  1. 高性能网站建设的最佳实践(二)

    原文译自雅虎开发者社区,转载译文请标明出处. 关注我的sina微博,共同进步! 为了让网页响应速度更快Exceptional Performance团队列出了一系列的最佳实践,包括35个最佳实践条目, ...

  2. 视频直播网站开发的最佳实践

    随着互联网技术的不断发展,视频直播成为了网络世界中的一股热潮.无论是企业还是个人,都可以通过搭建自己的视频直播网站来实现自己的目标.但是,对于很多企业来说,视频直播网站的开发是一项复杂的任务.因此,本 ...

  3. 雅虎对提升网站性能的最佳实践(英文)

    原文地址: https://developer.yahoo.com/performance/rules.html Minimize HTTP Requests tag: content 80% of ...

  4. 高性能网站建设进阶指南:Web开发者性能优化最佳实践 pdf扫描版

    高性能网站建设进阶指南:Web开发者性能优化最佳实践是<高性能网站建设指南>姊妹篇.作者Steve Souders是Google Web性能布道者和Yahoo!前首席性能工程师.在本书中, ...

  5. Guava Cache 原理分析与最佳实践

    前言 在大部分互联网架构中 Cache 已经成为了必可不少的一环.常用的方案有大家熟知的 NoSQL 数据库(Redis.Memcached),也有大量的进程内缓存比如 EhCache .Guava ...

  6. (译)网站加速最佳实践——雅虎35条

    翻译了一下雅虎35条,这是原文地址. (雅虎的)卓越的性能团队已经确定了一些提升网页速度的最佳实践.该清单包括35条,分为7大类. 1.内容 最小化http请求 终端用户响应时间的80%用在前端.这个 ...

  7. 网站Cache全分析

    前言:本文经过我对大多数网站的http头分析.自己做网站中的一些缓存设置.服务器的一些配置优化,后又阅读了RFC2616HTTP协议相关内容,以做此文. 原版下载 1.为什么要cache? 这是个经常 ...

  8. 前后端分离最佳实践:搭建一个复习算法题的网站ReviseCode(一)

    前言:很多人学完SSM就直接学SpringBoot,几乎没有试过整合SSM框架,导致仅仅是学会了SpringBoot使用,并不知道为什么是这样配置.另一方面,有的人整合了SSM框架,并且配置完后完成了 ...

  9. java设计网站导航条_java – 最佳实践:2D HUD屏幕导航的设计模式

    如果您的应用程序具有完全处理2D绘图的GUI,那么处理绘制内容和触摸内容的最佳做法应该是什么? 更好理解的一个例子: 我有一张地图游戏.在这张地图上,我可以建造房屋和东西. 我还有一个可以扩展的信息栏 ...

最新文章

  1. VMware vSphere四种迁移类型的区别与适应场景
  2. 零基础可以学python吗-零基础适合学Python吗?小白能否学会Python?
  3. 开发基于Web的RSS阅读器
  4. 数据库面试题【六、Sql的优化】
  5. 1/100. Jewels and Stones
  6. 作为一名 ABAP 资深顾问,下一步可以选择哪一门 SAP 技术作为主攻方向?
  7. TF-IDF + K-Means 中文聚类例子 - scala
  8. activiti学习--08 连线
  9. Asp.net(c#)GridView分页时用图片显示上一页,下一页
  10. AngularJS之页面跳转Route
  11. Visio是一个很好的UML建模软件和一个很好的制图软件
  12. Hiho1384 倍增+归并排序
  13. mysql数据,中国最新行政区划数据,到乡村共5级
  14. 期货对冲套利实战知识
  15. RabbitMQ的Queue详解;
  16. YOLOv5的项目实践 | 手势识别项目落地全过程(附源码)
  17. 喝酒娱乐小游戏助力神器微信小程序源码下载多种游戏选择玩法多种
  18. 第6章 高级数据查询
  19. 162号段,165号段,167号段
  20. Oracle中用system存数据,【学习笔记】Oracle表空间 数据存放system表空间影响数据库性能...

热门文章

  1. 华硕笔记本自带win10改win7的方法
  2. mysql基础(九) 索引和视图
  3. 最新版本mysql jdbc驱动包获取表定义信息空指针异常处理方法
  4. 二线城市的我,和北京的同学比成长
  5. 贪心,POJ(2709)
  6. 安装python模块时,遇到error: Unable to find vcvarsall.bat
  7. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码
  8. zabbix监控交换机出图断断续续
  9. GridView列行操作
  10. 运维笔试Python编程题