缓存控制中的私有与公共

Posted

技术标签:

【中文标题】缓存控制中的私有与公共【英文标题】:Private vs Public in Cache-Control 【发布时间】:2010-08-16 10:29:40 【问题描述】:

您能否描述一个示例,说明 IIS 中托管的 asp.net 应用程序中公共和私有缓存控制之间的区别。

我在MSDN 中读到,区别如下:

公开: 设置 Cache-Control: public 以指定响应可被客户端和共享(代理)缓存缓存。

私人:默认值。设置 Cache-Control: private 以指定响应只能在客户端缓存,而不是共享(代理服务器)缓存。

我不确定我是否完全了解每种选择的利弊。何时使用或不使用它的示例会很棒。

例如,如果我有两个 Web 服务器托管同一个应用程序,我应该怎么做?如果我选择 Private 或 Public,有什么要注意的吗?

【问题讨论】:

【参考方案1】:

唯一的区别是,使用 Private 时,您不允许代理缓存通过它们传输的数据。最后,这一切都归结为您发送的页面/文件中包含的数据。

例如,您的 ISP 可能在您和 Internet 之间有一个不可见的代理,即缓存网页以减少所需的带宽量并降低成本。通过使用 cache-control:private,您指定它不应该缓存页面(但允许最终用户这样做)。如果你使用 cache-control: public,你是说每个人都可以缓存页面,所以代理会保留一份副本。

根据经验,如果 每个人 都可以访问它(例如,此页面中的徽标),那么 cache-control: public 可能会更好,因为缓存它的人越多,您需要的带宽更少。如果它与连接的用户相关(例如,此页面中的 html 包含我的用户名,因此对其他人没有用处) cache-control: private 会更好,因为代理会缓存数据这不会被其他用户请求,而且他们也可能将您不希望保存在您不信任的服务器中的数据保存在其中。

当然,所有不公开的东西都应该有一个私有缓存。否则数据可能存储在中间代理服务器中,任何有权访问它的人都可以访问它。

【讨论】:

唯一的区别是,使用 Private 您不允许代理缓存...我猜这是一个错字。除此之外,答案+1。值得补充的是,私有不提供任何程度的安全性,中间的代理仍然可以看到它。这只是意味着没有“诚实”的代理会将其提供给其他人,而不是新生成的响应。 已修复!这很有趣,因为我在发布之前重读了几次,但我想我知道“不”必须在那里,所以我只是添加了它:D。是的,对您的评论 +1,因为应该注意的是,虽然建议用于与用户相关的数据,但私有不会取代真正的安全性 (SSL)。 在不应该写“not”的时候写“not”或者在应该写的时候省略它是很容易的。我知道我自己的大量自我编辑(在不同领域)正在修复相同的错字。 那么如果我们不指定任何东西,默认行为是“public”还是“private”? @Honey 但可以有多个客户端使用同一个代理。如果可以向所有客户端发送相同的响应,则可以在代理级别缓存,否则可以在客户端缓存(仍然存在即使这样也是一个坏主意的情况),但不能在代理上缓存。跨度>

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

什么是缓存控制:私有?

私有缓存与公有缓存

HTTP 缓存

对Integer类中的私有IntegerCache缓存类的一点记录

使用 GraphQL 的 Cloudfront 缓存?

适用于不同类型资源的理想 HTTP 缓存控制标头