缓存控制

Posted 漫游云端

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存控制相关的知识,希望对你有一定的参考价值。


缓存控制是指示浏览器缓存行为HTTP标头简而言之,当某人访问网站时,其浏览器将在某些存储(称为缓存)中保存某些资源,例如图像和网站数据。当该用户重新访问同一网站时,缓存控制设置规则,这些规则确定该用户是否将从本地缓存中加载这些资源,或者浏览器是否必须向服务器发送新资源的请求。为了更深入地了解缓存控制,需要对浏览器缓存和HTTP标头有基本的了解。

什么是浏览器缓存?

如上所述,浏览器缓存是指Web浏览器保存网站资源时,因此不必从服务器再次获取它们。例如,网站上的背景图像可能会保存在本地缓存中,这样当用户第二次访问该页面时,该图像将从用户的本地文件加载,并且页面加载速度会更快。

浏览器将仅在指定的时间段(称为生存时间(TTL))中存储这些资源如果在TTL过期后用户请求缓存的资源,浏览器将不得不再次与服务器联系并下载该资源的新副本。浏览器和Web服务器如何知道每种资源的TTL?这是HTTP标头起作用的地方。

什么是HTTP标头?

超文本传输协议(HTTP)概述了Internet上通信的语法,该通信包括客户端对服务器的请求和服务器对客户端的响应。这些HTTP请求和响应每个都带有一系列称为标头的键/值对。

这些标头包含有关每次通信的许多重要信息。例如,请求标头通常包含:

  1. 有关请求什么资源的信息

  2. 客户端正在使用哪个浏览器

  3. 客户将接受哪种数据格式

响应标头通常包含以下信息:

  1. 请求是否成功完成

  2. 响应主体中任何资源的语言和格式。

缓存控制标头可以出现在HTTP请求和响应中。

缓存控制标头中有什么?

标头包含由冒号分隔的键值对。对于缓存控制,“键”或冒号左侧的部分始终为“缓存控制”。“值”是在冒号右侧找到的,并且可以有一个或几个逗号分隔的值用于高速缓存控制。





这些值称为伪指令,它们指示谁可以缓存资源以及在必须更新资源之前可以缓存这些资源多长时间。下面我们通过一些最常见的缓存控制指令:

缓存控制:私有

带有“专用”指令的响应只能由客户端缓存,而不能由CDN或代理之类的中介代理缓存这些资源通常是包含私人数据的资源,例如显示用户个人信息的网站。

缓存控制:公共

相反,“ public”指令表示资源可以由任何高速缓存存储。

缓存控制:无存储

带有“ no-store”指令的响应永远无法缓存在任何地方。这意味着每次用户请求此数据时,都必须将请求发送到原始服务器以获取新副本。该指令通常保留给包含极其敏感数据的资源,例如银行帐户信息。

缓存控制:无缓存

此指令意味着,如果不先检查是否有更新的版本,就无法使用请求资源的缓存版本。通常使用ETag完成此操作。

ETag是另一个HTTP标头,其中包含一个令牌,该令牌对于请求资源时的版本是唯一的。每当资源更新时,此令牌就在原始服务器上更改。

当用户返回具有“无缓存”资源的页面时,客户端将始终必须连接到原始服务器,并将缓存资源上的ETag与服务器上的ETag进行比较。如果ETag相同,则将向用户提供缓存的资源。如果没有,则意味着资源已经更新,客户端将需要下载新版本以提供给用户。此过程可确保用户始终获得该资源的最新版本,而无需不必要的下载。

缓存控制:最大年龄

该指令规定了生存时间,换句话说,资源在下载后可以从缓存中服务多少秒。例如,如果将最大期限设置为1800,这意味着在首次从服务器请求资源后的1800秒(30分钟)内,将在后续请求中向用户提供该资源的缓存版本。如果在30分钟后用户再次请求资源,则客户端将不得不向原始服务器请求新副本。

“ s-maxage”指令专门用于CDN之类的共享缓存,它指示这些共享缓存可以保持多长时间从缓存中获取资源。该指令会覆盖各个客户的“最大年龄”指令。

为什么缓存控制很重要?

浏览器缓存是一种既可以保留资源又可以改善Internet上用户体验的好方法,但是如果没有缓存控制,它将非常脆弱。每个站点上的每个资源都将受到相同的缓存规则的约束,这意味着敏感信息将以与公共信息相同的方式进行缓存,并且频繁更新的资源将以与很少更改的资源相同的时间进行缓存。

缓存控制增加了使浏览器缓存真正有用的灵活性,使开发人员可以决定如何缓存每个资源。它还允许开发人员为中介机构设置特殊规则,这就是为什么使用CDN的网站(例如Cloudflare CDN)倾向于比不使用CDN的网站表现更好的原因。



转自于:https://www.cloudflare.com/learning/cdn/glossary/what-is-cache-control/

以上是关于缓存控制的主要内容,如果未能解决你的问题,请参考以下文章

Spring控制器没有获得缓存控制头

HTTP缓存控制 总结

如何使控制器中的缓存数据 [OutputCache] 无效?

即使超过缓存控制年龄限制,值也会从缓存中加载

105.输出控制缓存

内存缓存控制面板?