HTTP缓存(HTTP Cacheing):缓存控制(Cache-Control)
Table of Contents
不同种类的缓存
专用浏览器缓存
共享代理缓存
缓存操作的目标
控制缓存
该Cache-Control头
该Pragma头
新鲜
开发资源
缓存验证
电子标签
最后修改
不同的回应
缓存控制 - Cache-Control
也可以看看
技术指标
浏览器兼容性
通过重新使用以前获取的资源,可以显着提高网站和应用程序的性能。Web缓存减少了延迟和网络流量,因此减少了显示资源表示形式所需的时间。通过使用HTTP缓存,网站变得更加敏感。
不同种类的缓存
缓存是一种存储给定资源副本并在请求时将其提供回来的技术。当Web缓存在其存储中具有请求的资源时,它将拦截该请求并返回其副本,而不是从原始服务器重新下载。这实现了几个目标:减轻不需要为所有客户端本身提供服务的服务器的负载,并通过更接近客户端来提高性能,即,将资源传回的时间更少。对于网站而言,它是实现高性能的主要组成部分。另一方面,必须正确配置它,因为并非所有资源都永远保持相同:重要的是仅在资源更改之前(而不是更长)缓存资源。
缓存有几种:可以分为两个主要类别:专用缓存或共享缓存。甲共享高速缓存是一个高速缓存用于通过一个以上的用户复用存储的响应。一个私有缓存专用于单个用户。此页面将主要讨论浏览器和代理缓存,但也将网关缓存,CDN,反向代理缓存和负载平衡器部署在Web服务器上,以提高网站和Web应用程序的可靠性,性能和可伸缩性。
专用浏览器缓存
专用缓存专用于单个用户。您可能已经在浏览器的设置中看到了“缓存”。浏览器缓存包含用户通过HTTP下载的所有文档。此高速缓存用于使访问的文档可用于后退/前进导航,保存,按源查看等,而无需额外访问服务器。它同样改善了缓存内容的脱机浏览。
共享代理缓存
共享缓存是一种缓存,用于存储要由多个用户重用的响应。例如,ISP或您的公司可能已将Web代理设置为其本地网络基础结构的一部分,以为许多用户提供服务,从而使受欢迎的资源得以重复使用多次,从而减少了网络流量和延迟。
缓存操作的目标
HTTP缓存是可选的,但通常希望重用缓存的资源。但是,常见的HTTP缓存通常仅限于缓存对GET
其他方法的响应,并且可能会拒绝其他方法。主缓存键由请求方法和目标URI组成(通常仅使用URI,因为只有GET请求才是缓存目标)。缓存条目的常见形式是:
- 检索请求的成功结果:
200
对GET
包含诸如HTML文档,图像或文件之类的资源的请求的(OK)响应。 - 永久重定向:(永久
301
移动)响应。 - 错误响应:(
404
未找到)结果页面。 - 结果不完整:(
206
部分内容)回复。 GET
定义了是否适合用作缓存键的响应。
如果请求是内容协商的目标,则高速缓存条目还可能包含多个存储的响应,这些响应由辅助键来区分。有关更多详细信息,请参见下面的Vary
标题信息。
控制缓存
该Cache-Control
头
Cache-Control
HTTP / 1.1通用头字段被用于为请求和响应缓存机制指定指令。使用此标头可以使用它提供的各种指令来定义缓存策略。
没有缓存
缓存不应存储有关客户端请求或服务器响应的任何内容。一个请求被发送到服务器,并且每次都下载一个完整的响应。
Cache-Control: no-store
缓存但重新验证
缓存将在释放缓存副本之前将请求发送到原始服务器进行验证。
Cache-Control: no-cache
私人和公共缓存
“ public”伪指令指示响应可以被任何缓存器缓存。如果现在应该缓存具有HTTP身份验证的页面或通常无法缓存的响应状态代码,这将很有用。
另一方面,“专用”表示响应仅针对单个用户,并且不得由共享缓存存储。在这种情况下,专用浏览器缓存可以存储响应。
Cache-Control: private
Cache-Control: public
期满
这里最重要的指令是“ max-age=<seconds>
”,这是资源被视为新鲜的最长时间。与Expires
此相反,此指令是相对于请求时间的。对于应用程序中不会更改的文件,通常可以添加主动缓存。例如,这包括静态文件,例如图像,CSS文件和JavaScript文件。
有关更多详细信息,另请参见下面的“新鲜度”部分。
Cache-Control: max-age=31536000
验证方式
使用“ must-revalidate
”指令时,缓存必须在使用之前验证过时资源的状态,并且不应使用过期的资源。有关更多详细信息,请参见下面的“验证”部分。
Cache-Control: must-revalidate
该Pragma
头
Pragma
是HTTP / 1.0标头,未指定用于HTTP响应,因此,如果请求中省略标头字段Cache-Control
,尽管它的行为与相同,但它不是常规HTTP / 1.1标头的可靠替代。使用仅适用于HTTP / 1.0客户端的向后兼容性。Cache-Control: no-cacheCache-ControlPragma
新鲜
一旦资源存储在缓存中,理论上就可以永远由缓存提供服务。缓存的存储空间有限,因此会定期从存储中删除项目。此过程称为缓存逐出。另一方面,服务器上的某些资源可能会更改,因此应更新缓存。由于HTTP是一种客户端服务器协议,因此当资源发生更改时,服务器无法联系缓存和客户端。他们必须传达资源的到期时间。在此到期时间之前,资源是新鲜的;到期后,资源已 过时。驱逐算法通常将新资源优先于陈旧资源。注意,过时的资源不会被驱逐或忽略。当高速缓存接收到过时资源的请求时,它将转发带有的请求,If-None-Match
以检查它是否实际上仍然是最新的。如果是这样,服务器将返回304
(未修改)标头,而不发送所请求资源的主体,从而节省了一些带宽。
这是使用共享缓存代理的此过程的示例:
新鲜度寿命是基于多个标头计算的。如果Cache-Control: max-age=N
指定了“ ”标头,则新鲜度寿命等于N。如果不存在此标头(通常是这种情况),则检查是否存在Expires
标头。如果Expires
存在标头,则其值减去Date
标头的值将确定保鲜期。最后,如果两个标题都不存在,请查找Last-Modified
标题。如果存在此标头,则高速缓存的新鲜度生存期等于Date
标头的值减去标头的值Last-modified
除以10。
到期时间的计算如下:
expirationTime = responseTime + freshnessLifetime - currentAge
responseTime
根据浏览器收到响应的时间是哪里。
开发资源
我们使用缓存的资源越多,网站的响应能力和性能就会越好。为了对此进行优化,良好做法建议设置尽可能长的过期时间。这在定期或经常更新的资源上是可能的,但对于很少且不经常更新的资源来说是有问题的。它们是从缓存资源中受益最大的资源,但这使它们很难更新。这是每个Web页面中包含和链接的技术资源的典型代表:JavaScript和CSS文件很少更改,但是当它们更改时,您希望它们进行快速更新。
Web开发人员发明了Steve Souders称之为revving [1]的技术。很少更新的文件以特定的方式命名:在它们的URL中(通常在文件名中)添加修订(或版本)号。这样,此资源的每个新修订版都将被视为独立的资源,永远不会更改,并且可能会在很远的将来到期,通常是一年或更长时间。为了拥有新版本,必须更改指向它们的所有链接,这是此方法的缺点:额外的复杂性通常由Web开发人员使用的工具链来解决。当不经常变化的资源发生变化时,它们会导致对经常变化的资源进行其他更改。读取这些文件时,还将读取其他文件的新版本。
这种技术还有一个好处:同时更新两个缓存的资源不会导致一种情况,即一种资源的过时版本与另一种资源的新版本结合使用。当网站具有相互依赖的CSS样式表或JS脚本时,这是非常重要的,即它们相互依赖,因为它们引用相同的HTML元素。
添加到已修订资源中的修订版本不必是1.1.3之类的经典修订字符串,甚至不必单调增长数字。它可以是防止冲突的任何内容,例如哈希或日期。
缓存验证
当达到缓存文档的到期时间时,将对其进行验证或再次获取。仅当服务器提供了强验证器或弱验证器时,才可以进行验证。
当用户按下重新加载按钮时,将触发重新验证。如果缓存的响应包含“ Cache-Control: must-revalidate
”标头,也会在正常浏览下触发。另一个因素是“首Advanced->Cache
选项”面板中的缓存验证首选项。有一个选项可以在每次加载文档时强制进行验证。
电子标签
的ETag
响应报头是不透明到所述-用户代理可以使用作为强验证值。这意味着HTTP用户代理(例如浏览器)不知道该字符串代表什么,也无法预测其值。如果ETag
标头是资源响应的一部分,则客户端可以If-None-Match
在将来的请求的标头中发出,以验证缓存的资源。
最后修改
的Last-Modified
响应报头可以被用作弱验证器。它被认为是弱的,因为它只有1秒的分辨率。如果Last-Modified
响应中存在标头,则客户端可以发出If-Modified-Since
请求标头以验证缓存的文档。
发出验证请求后,服务器可以忽略验证请求并使用normal响应,也可以返回(正文为空)以指示浏览器使用其缓存的副本。后者的响应还可以包括用于更新缓存文档的到期时间的标头。200
OK
304
Not Modified
不同的回应
该Vary
HTTP响应头决定如何满足未来的请求头,以决定一个缓存的响应是否可以使用,而不是请求从源服务器一个新的一个。
当缓存接收到具有Vary
头字段的缓存响应可以满足的请求时,除非Vary
原始请求(缓存)的请求和新请求中所有由头指定的头字段都匹配,否则缓存不得使用该缓存的响应。
例如,这对于动态提供内容很有用。使用Vary: User-Agent
标题时,缓存服务器在决定是否从缓存中提供页面时应考虑用户代理。如果您要向移动用户提供不同的内容,则可以帮助您避免缓存可能会错误地为移动用户提供网站的桌面版本。此外,它还可以帮助Google和其他搜索引擎发现网页的移动版本,并且还可以告诉他们没有隐瞒的意图。
Vary: User-Agent
由于User-Agent
移动客户端和桌面客户端的标头值不同(“不同”),因此不会将缓存用于错误地为桌面用户提供移动内容,反之亦然。
缓存控制 - Cache-Control
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
略。
也可以看看
- RFC 7234:超文本传输协议(HTTP / 1.1):缓存
- 缓存教程– Mark Nottingham
- HTTP缓存– Ilya Grigorik
- RedBot,一种用于检查与缓存相关的HTTP标头的工具。
- HTTP缓存常见问题解答
- Web作者和网站管理员的缓存教程
- 指南:
Cache-Control
平民 Age
Expires
Pragma
技术指标
规范 | 状态 | 评论 |
---|---|---|
RFC 8246:HTTP不可变响应 | IETF RFC | |
RFC 7234:超文本传输协议(HTTP / 1.1):缓存 | IETF RFC | |
RFC 5861:过时内容的HTTP缓存控制扩展 | IETF RFC | 初始定义 |
浏览器兼容性
铬 |
边缘 | 火狐浏览器 | IE浏览器 | 歌剧 | 苹果浏览器 | Android Webview | 适用于Android的Chrome | Android版Firefox | Android版Opera | iOS上的Safari | 三星上网 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Cache-Control
|
全力支持是 | 全力支持12 | 全力支持是 | 全力支持是 | 全力支持是 | 全力支持是 | 全力支持是 | 全力支持是 | 全力支持是 | 全力支持是 | 全力支持是 | 全力支持是 |
immutable
实验性
|
没有支持没有
笔记
打开 |
没有支持15-79 | 全力支持49 | 没有支持没有 | 没有支持没有 | 全力支持11 | 没有支持没有 | 没有支持没有 | 没有支持没有 | 没有支持没有 | 全力支持11 | 没有支持没有 |
stale-if-error
实验性非标
|
没有支持没有
笔记
打开 |
没有支持没有
笔记
打开 |
没有支持没有
笔记
打开 |
没有支持没有 | 没有支持没有 | 没有支持没有 | 没有支持没有 | 没有支持没有 | 没有支持没有 | 没有支持没有 | 没有支持没有 | 没有支持没有 |
stale-while-revalidate
实验性非标
|
全力支持75 | 全力支持79 | 全力支持68 | 没有支持没有 | 没有支持没有 | 没有支持没有 | 全力支持75 | 全力支持75 | 全力支持68 | 没有支持没有 | 没有支持没有 | 没有支持没有 |
HTTP缓存(HTTP Cacheing):缓存控制(Cache-Control)相关推荐
- 【Manual】Memory Cache Control
[Intel-64 and IA-32 Architectures Software Developer's Manual]Chapter 11 本章节关于 memory cache.cache co ...
- HTTP缓存——304与200 from cache
个人博客原文地址 HTTP与缓存相关的字段 1. 通用字段 字段名称 释义 Cache-Control 控制缓存具体的行为 Pragma HTTP1.0时的遗留字段,当值为"no-cache ...
- 浏览器Disk Cache磁盘缓存及其协商缓存、及原生App和浏览器实现缓存的差异
浏览器Disk Cache磁盘缓存及其协商缓存.及原生App和浏览器实现缓存的差异 目录 浏览器Disk Cache磁盘缓存及其协商缓存.及原生App和浏览器实现缓存的差异 1.Memory Cach ...
- ngnix mysql 缓存清除_利用Proxy Cache使Nginx对静态资源进行缓存
前言 Nginx是高性能的HTTP服务器,通过Proxy Cache可以使其对静态资源进行缓存.其原理就是把静态资源按照一定的规则存在本地硬盘,并且会在内存中缓存常用的资源,从而加快静态资源的响应. ...
- syslog 向内存中缓存_漫谈缓存(Cache)、大规模芯片系统的存储层次结构优化以及开源仿真工具ZSim...
这次的话题将从缓存开始,以一种易于理解的方式向大家呈现缓存的基本概念,然后拓展至大规模芯片系统的非均一访问延时的缓存访问问题,最后简要介绍一种缓存仿真工具--ZSim. 缓存的概念 处理器和内存之间存 ...
- 3. java缓存-线程内缓存guava cache
guava cache的缓存结构 常用的guava cache缓存 根据上图中的缓存框架,我们常用的一些缓存实例有:LocalManualCache和LocalLoadingCache,两者唯一的区别 ...
- cache 强缓存与弱缓存区别
Caches作用 Web缓存可以保存常见文档副本,当发起Web请求时,如果本地有 "已缓存的" 的副本,就可以直接从本地存储中提取这个文档,而不是去从原始服务器中拿. 减少冗余数据 ...
- wordpress优化加速缓存插件:WP Super Cache
就本身而言,一个完善的WordPress主题就可以解决很多需要安装插件的问题,就例如一个完善的主题可以完全不用安装任何的SEO主题,因为安装SEO相关的插件会占用大量的数据库,生成一些根本调用不多的数 ...
- linux nginx http cache时间不对,Linux中Nginx设置proxy_cache缓存与取消缓存-linux-操作系统-壹...
本文章来讲述一下关于Linux中Nginx设置proxy_cache缓存与取消缓存实现方法,有需要的朋友可参考. 在配置文件的server{}内,添加这么一句即可: 代码如下 复制代码 locatio ...
- 基于反向代理的Web缓存应用-可缓存的CMS系统设计
基于反向代理的Web缓存加速 --可缓存的CMS系统设计 作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com 写于:2003/05 ...
最新文章
- webpack使用教程 翻译自阮一峰(机翻)
- Tkinter的OptionMenu组件
- CserialPort类的简单用法
- Mysql 中Sql控制流语句_DCL语句/控制流语句
- 为普及再助一把力!《2021年中国低代码/无代码市场研究报告》正式发布
- In和exists使用及性能分析(一):in的使用
- MTK 驱动(72)---mtk Android如何调试recovery模块
- yconsole使用说明
- C#的TextBox控件输入测试-只允许输入数字的测试:
- python底层源码_python源码剖析——系列一
- qq令牌64位密钥提取_令牌QQ号代码64位数字+字母只截图保存可转换文字再来获取口令...
- 查看kms服务器信息,查看kms服务器地址
- 项目经理所应具备的八项素质:
- 如何提炼游戏IP的价值,《梦幻西游三维版》给我们上了一课
- git中误提交了不想提交的文件,想要从版本库中删除的方法
- Redis ZADD命令
- 清华大学计算机系女生人数,2013年清华大学在各省市录取人数及男女比例
- 由《樱桃小丸子》想到的……(未完成)
- Python ABC(抽象基类)
- RTL-8201以太网芯片外围电路