2

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

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

在我看来,这听起来很矛盾。If-Not-Match={ETag} 浏览器在请求时查询服务器以查看资产是否已更改。那么这里的作用是什么max-age

4

1 回答 1

1

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

Cache-Control是一个指示浏览器在max-age. 这性能要高得多。这对于可能不会更改的静态资产很有用,例如jquery-3.1.js 文件将始终相同。或者即使资源被改变也没什么大不了的,例如style.css.

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

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

于 2020-07-26T09:10:27.687 回答