HTTP 请求中的缓存:ETag vs max-age



我有一个 SPA,它消耗后端服务器的一些静态资产。出于原因,我选择了ETag验证作为缓存机制。简而言之,我希望浏览器将资产永久保留在其缓存中,只要相关ETag保持不变。

若要向浏览器发出有关缓存的信号,响应中必须存在标头Cache-Control。对我来说,这是绝对可以理解的,但让我感到困惑的是,我还必须在标题中提供max-age。换句话说,Cache-Control=public不起作用,而Cache-Control=public, max-age=100是正确的标头。

对我来说,这听起来很矛盾。浏览器查询服务器,以查看资产是否在任何时候使用If-Not-Match={ETag}进行更改。那么max-age在这里的作用是什么呢?

每次都会请求使用 ETag 缓存在浏览器中的资源/文件。如果这是服务器上更改的*.js文件,则服务器将发送带有新ETag的新版本,浏览器将刷新其缓存版本。 但无论如何,执行了请求和响应的完整网络往返,这是相当昂贵的。 如果您确实希望某些文件确实可能随时更改,则必须使用 ETag。

Cache-Control是浏览器的指令,在max-age指定的一段时间内甚至不要尝试检索更新的版本。这要高得多。 这对于可能不会更改的静态资产很有用,例如jquery-3.1.js文件将始终相同。 或者即使资源发生了变化也没什么大不了的,例如style.css.

在开发过程中,当资产经常更改时,通常会禁用Cache-Control

但请注意public修饰符:这意味着资源可以缓存在代理服务器(如CloudFlare(上,并在不同用户之间共享。如果资源具有私人信息(例如消息(,则用户可能会看到彼此的数据。

相关内容

  • 没有找到相关文章

最新更新