网站 cache control 最佳实践

news/2024/5/9 16:09:40/文章来源:https://blog.csdn.net/duysh/article/details/103948050

推荐阅读:

  • 2020年软件开发趋势
  • 高并发案例 - 库存超发问题
  • 负载均衡的分类及算法
  • 异地多活架构
  • Postman 的替代品来了

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

通常,是因为 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

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

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

相关文章

php 随机在文章中添加锚文本_网站锚文本SEO优化 - 最蜘蛛池

原出处:最蜘蛛池原文链接:网站锚文本SEO优化 - 最蜘蛛池一、站内锚文本从字面上,大家就清楚了,站内锚文本当然说的是网站内部的,这里主要以文章来说事(其实网站优化锚文本指的就是文章页优化,至…

网站封装单个exe_网站中:https和http的主要区别

https和http的主要区别1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。3、http和https使用的是完全不同的连接方式&#xff0…

《Python数据分析与挖掘实战》第12章——电子商务网站用户行为分析及服务推荐(协同推荐)数据探索分析篇①

文章目录1 背景与目标分析2.数据探索分析2.1 网页类型分析2.1.1 统计各个网页类型所占的比例2.1.2 网页107类型中的内部统计2.1.3 统计带"?"问号网址类型统计2.1.4 统计199类型中的具体类型占比2.1.5 统计瞎逛用户中各个类型占比2.2 点击次数分析2.2.1 统计点击次数…

《Python数据分析与挖掘实战》第12章——电子商务网站用户行为分析及服务推荐(协同推荐)数据预处理篇②

文章目录1 数据清洗1.1 查看各个需要删除的规则包含的信息1 数据清洗 1.1 查看各个需要删除的规则包含的信息 类型网页 import pandas as pd from sqlalchemy import create_engine# 读取数据库数据 engine create_engine(mysqlpymysql://root:localhost/wangye?charsetut…

提升 10 倍网站访问速度,全局负载均衡与CDN内容分发

CDN简介 CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,…

一款开源免费的网站监控系统

做过前端的开发的小伙伴想必经常被线上的各种问题弄的焦头烂额,不是出现适配问题,就是出现功能异常。 虽然,公司一般也有各种监控系统来帮助我们分析和发现问题,但是,我们每次解决问题都需要辗转于各种监控系统之间&a…

基于Python电影网站系统的日志

文章目录使用技术:模块10.1810.1910.2610.2711.1611.1712.2512.269-1上映预告-标签筛选-电影分页9-2 电影搜索-电影详情5-4 会员-收藏-评论管理页面搭建6-8 修改密码6-9 日志管理1.1遇到的问题1. 当验证在Flask中失败时,如何覆盖html默认的“请填写此字段…

Flask搭建新闻网站①

跟之前flask做的ihome租房网站类似,配置信息几乎完全一样,这里只记录下重点内容 git忽略log日志可在logs文件夹下加 .gitkeep文件 文章目录项目预览文章列表页文章详情页个人中心Day108_表结构分析数据库迁移显示网站logo文件Day2使用请求钩子自定义过滤…

Flask搭建新闻网站②

文章目录Day5404创建管理员管理员登录用户统计防止用户进入admin页面gunicorn运行项目nginxDocker部署服务器建立docker镜像Day5 404 # 统一返回404页面 index_bp.route(/404) user_login_data def page_not_found():data {"user_info": g.user.to_dict() if g.use…

Django+xadmin实现教育网站系统

文章目录环境配置与项目介绍Django升级2.0 注意的点app管理数据库设计注册model注册app目录5 xadmin搭建后台管理系统5-3 users app 的model注册5-5 xadmin全局配置app.py 定义app后台名称第6章 用户注册功能实现6.1 登录表单验证6-6 session和cookie自动登录机制用户注册发送邮…

Django+xadmin实现教育网站系统②

文章目录第10章 个人中心和全局搜索功能实现全局搜索修改头像第11章 首页、全局功能细节和404以及500页面配置第12章 常见web攻击及防范sql注入12-2 xss攻击原理及防范12-3 csrf攻击与防范第13章 xadmin的进阶开发13-1 userprofile注册以及django的权限管理13-3 model_icon, 只…

视频网站解决带宽问题(总结)

自己搜来的一些方案,汇总下供自己学习吧 1.大带宽是重中之重 所有了解视频类应用的人都知道,视频网站的带宽才是重中之重。在线视频播放网站每天都会产生巨额的流量,每个客户都会占据非常大的带宽。如果带宽不够就会出现用户播放卡顿&#…

php投票网站教程,PHP之投票联系

1.建立数据库表1:DiaoYanTiMu表2:DiaoYanXuanXiang2.页面页面1:投票首页无标题文档#fanhui{ display:none}$db new MySQLi("localhost","root","123","mydb");$sql "select * from diaoyanti…

网站页面左右_建设一个普通的网站需要多少钱?就是一个展示型的公司网站。...

这个问题在行业内是没有准确定义的,每一个建站公司在面对不同的客户需求,都会有不同的报价模式,而影响价格的因素有很多,但无疑建站成员所拥有的“宝贵经验”往往是最贵的,这也是建站公司相互报价差距巨大的原因。要想…

java页面加速_为你的网站加速

我的博客刚成立也是不久,所以现在我关注了很多中小博客站点,发现很多站点打开速度很慢,甚至有一些网站出现打不开的情况。网站运行不稳定,可能和使用的服务器有关系,因为很多人都图方便,为了不备案直接使用…

linux 重启命令nginxed,Nginx转发,部署网站相关linux命令

进入目录cd /etc/nginx/sites-available进入文件defaultsudo vim default;编辑a鼠标右键粘贴退出编辑Esc保存:wq重启Nginx服务sudo service nginx restart清空default里面的内容sudo sh -c encho "" >default创建manage-front文件,并复制cib-front到ma…

电子病历模板编辑器_这几个邮件模板网站,帮助提升工作效率

AUTOKLOSE: 一些免费的邮件正文模板。Autopilot Templates:ree customer journey templates for marketing automationBEE TEMPLATES for GMAIL: 可编辑Gmail邮件模板。COLD EMAIL TEMPLATE: 一系列营销邮件模板。Contactually: 不知道邮件内容怎么写?参考下这些邮件…

关于ssm框架的外文文献及译文_使用彩云小译,翻译外文网站实现双语对照

彩云小译扩展,实现外语网页的翻译功能,一段原文一段译文,让查阅外文资料可以随心所欲。整理&排版 | idea君 ,预计阅读时间 | 3分钟 文章意在学习交流分享,如有侵权请联系删除 封面:http://www.pexels.c…

网站index.php怎么关联其余,thinkphp隐藏index.php/home并允许访问其他模块的实现方法...

想要达成的效果很简单,我有两个模块,Home、Wechat。http://localhost/index.php/home/index/index 缩短为: http://localhost/index/indexhttp://localhost/index.php/wechat/index/index 缩短为: http://localhost/wechat/index/…

php5.2.8升级,UWA2.X通用建站升级程序

UWA2.X通用建站升级程序是一款基于PHP和MySQL开发的通用建站系统,程序简洁、灵活而具备强大的扩展性,将是您轻松建站的首选利器。采用XML名字空间风格核心模板:模板全 部使用文件形式保存,对用户设计模板、网站升级转移均提供很大…