cache-control_网站 cache control 最佳实践

news/2024/5/19 2:26:46/文章来源:https://blog.csdn.net/weixin_39844942/article/details/110667629
6b5854ff95b7f778d2fac74f76e613f8.png

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

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

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

缓存在后台如何工作?

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

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

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

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

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

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

04373a36f806b82f5db31b9334d3d6a2.png

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

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

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

Etag(实体标签)

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

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

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

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

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

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

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

f41ae5ef52199bdeb36dd50db661115d.png

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

e23418747411ef895d50eae074b5d896.png

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

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

Last Modified

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

HTTP header 信息例如:

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

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

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

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

b48e013ecc952b5893b80418740bf66c.png

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

d9de0ea5677195f120d26c5055915707.png

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

14df06783562cb932f6883268eb0b57d.png

所以,“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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_703570.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring配置文件_SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件...

SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件一、概述Spring Boot允许多种配置来源,官网是这样说的:Spring Boot使用一种非常特殊的PropertySource顺序,旨在允许合理地覆盖值。按以下顺序考虑属性…

如何用python创建一个下载网站-用Python下载一个网页保存为本地的HTML文件实例...

我们可以用Python来将一个网页保存为本地的HTML文件,这需要用到urllib库。 比如我们要下载山东大学新闻网的一个页面,该网页如下:实现代码如下: import urllib.request def getHtml(url): html urllib.request.urlopen(url).read…

如何用python创建一个下载网站-用Python下载一个网页保存为本地的HTML文件实例...

我们可以用Python来将一个网页保存为本地的HTML文件,这需要用到urllib库。 比如我们要下载山东大学新闻网的一个页面,该网页如下:实现代码如下: import urllib.request def getHtml(url): html urllib.request.urlopen(url).read…

一步步学习SPD2010--第十一章节--处理母版页(10)--重置母版页到网站定义

一步步学习SPD2010--第十一章节--处理母版页(10)--重置母版页到网站定义 在第一章节,你将内容页重置为网站定义。重置母版页到网站定义也没有什么不同。你丢失了在页面上做出的自定义,包括任何静态文本、图片、控件或Web部件。SPD…

拥抱单页网站! jQuery全屏滚动插件fullPage.js

不知道从什么时候开始,单页网站就悄悄走进人们的视线,尤其是国外的网站,更是钟爱单页网站.制作一个全屏滚动的效果,然后每个滚动页弄一个好看的背景色,配上一些描述性的文字,大家都喜欢这么弄,仿佛逼格瞬间可以爆表似的.当然,不得不承认,介绍产品的页面用单页网站似乎确实高大上…

如何实现网站文件动静分离

背景 传统动静不分离的产品架构,随着访问量在增长,性能会成为瓶颈。以一个常见的Web站点为例。www.acar.com是一个刚建立汽车资讯车友交流网站,主站用Php搭建,有10GB的图片素材,部分JS文件。目前购买一台ECS放置所有程…

自学python推荐书籍同时找哪些来实践-Python学习路上有这些论坛、网站、书籍与你同行...

Python学习路上有这些论坛、网站、书籍与你同行 2019-05-03 18:24:41 613点赞 9508收藏 164评论 创作立场声明:希望我的一些经验可以给你少走一些弯路,但人总得走点弯路才可以成长。别怕,在学习python的路上有我陪着你。人生苦短,…

java用nat123_「网速123」使用nat123怎样解决网速慢的问题? - seo实验室

网速123许多人在使用Nat123时会遇到网速慢的问题,下面就来说说相关的解决方法。1、cname正确指向。cname指向的唯一性。使用自己的域名时,如设置cname指向nat123的,确保cname的唯一性,不对应的cname指向解析慢或其他不可预知的问题…

怎么在python下载网站内容-分析某网站,并利用python自动登陆该网站,下载网站内容...

本帖最后由 愤怒的小车 于 2019-5-8 09:41 编辑 一:本代码是我研究了好久才写出来,七功能主要有自动登陆、自动识别验证码、以及自动识别下载格式进行判断下载! 首先,搬上我们的主角网址,http://lavteam.org/&#xff…

python爬虫怎么爬同一个网站的多页数据-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...

原标题:不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面…

高性能网站原则

https://blog.csdn.net/u011650048/article/details/51754423 1、图片压缩: 静态页面验收时,检查每张图片不能超过200K,每个页面不能超过2.5M CMS后台上传图片,检查每张图片不能超过200K,尽量不要使用原图,…

python从入门到入土表情包-Python开发个人专属表情包网站,表情在手,天下我有...

"表情包”是一种利用图片来表示感情的一种方式。表情包是在社交软件活跃之后,形成的一种流行文化,表情包流行于互联网上面,基本人人都会发表情。 曾经你是否也有过找不到表情包去应对别人的时候。 今天小编分享如何用Python开发个人专属…

让你的网站在IE8的兼容模式下运行

众所周知,微软的Internet Explorer团队一直在致力于将IE8打造为最符合业内标准的浏览器,所不幸的是,当前并非所有的网站都认同这些标准。如果你担心你的网站在IE8的标准模式下不能正常工作的话,下面这些方法也许对你有所帮助&…

某个网站打不开,其他网站正常的原因及解决办法

检测网站是否适应了cdn加速,可以在命令行中输入nslookup ip地址(nslookup http://www.360doc.com)如果address的值是多个,就证明使用了cdn加速。 可以使用cdn检测工具检测各地使用cdn加速后网络情况。同时如果全国不同地区访问节点…

技术文章精美配图模板网站推荐-创客贴

最近上海的风景很好,有清晨的微风、有蓝天白云,小编被大好河山迷住了,只顾着欣赏美景佳人,今天开始上班,把思绪和心情收回来,得花一些时间来写写东西,记录记录生活。 我经常逛知乎,也…

网站后台管理界面设计的一些想法

一、最常见的网站后台管理的界面布局 1.头部 2.菜单 3.主要工作区域 4.底部 二、工作区的交互设计 后台操作管理的主要工作区域在图示的区域3,古老的网站后台管理程序中,区域3被设计成一次只能展示一个页面。而现在的流行做法是区域3是多Tab的&#xff0…

legend3---阿里云如何多个域名指向同一个网站

legend3---阿里云如何多个域名指向同一个网站 一、总结 一句话总结: 先寻求资料及文档,没有找到的话自己摸索一下就好 结论:多个域名都需要备案 二、阿里云如何多个域名指向同一个网站 当前情况 一个域名(fanrenyi.com&#xff09…

如何用python创建一个下载网站-用Python下载一个网页保存为本地的HTML文件实例...

我们可以用Python来将一个网页保存为本地的HTML文件,这需要用到urllib库。 比如我们要下载山东大学新闻网的一个页面,该网页如下:实现代码如下: import urllib.request def getHtml(url): html urllib.request.urlopen(url).read…

如何用python创建一个下载网站-用Python下载一个网页保存为本地的HTML文件实例...

我们可以用Python来将一个网页保存为本地的HTML文件,这需要用到urllib库。 比如我们要下载山东大学新闻网的一个页面,该网页如下:实现代码如下: import urllib.request def getHtml(url): html urllib.request.urlopen(url).read…

Slog64_项目上线之ArthurSlog个人网站上线3

ArthurSlogSLog-64Year1GuangzhouChinaSeptember 9th 2018ArthurSlog PageGitHubNPM Package Page掘金主页简书主页segmentfault多言数穷 不如守中 开发环境MacOS(High Sierra 10.13.5) 需要的信息和信息源: 开始编码 本篇配置服务端环境网站的源码已经传送至服务器…