是否需要"缓存请求指令"和"缓存响应指令"?

GC_*_*GC_ 6 caching http http-headers web

如果我已经有"缓存请求指令",那么"缓存响应指令"的重点是什么.他们添加了什么吗?如果没有它们,我的应用程序是否会运行

我在寻找证明"缓存响应指令"是否冗余的证据.如果它们是多余的,我不会打扰它们.

GC_

sha*_*ncs 5

是否需要“缓存请求指令”和“缓存响应指令”?

是的Cache-Control请求标头和Cache-Control响应标头都是需要的。即使您已经Cache-Control在请求标头中,Cache-Control在响应中也不是多余的。它们是两个不同的东西。根据RFC7234

缓存指令是单向的,因为请求中指令的存在并不意味着响应中将给出相同的指令。

一般来说,Cache-Control响应头从资源提供者的角度控制缓存行为。-- 资源是否应该存储在缓存中?有效期是多久?当要求时,是否需要重新验证?由于可以为所有 HTTP 请求配置响应标头,因此“缓存响应指令”提供了一种为所有资源定义缓存策略的方法。

Cache-Control然而,在请求标头中,从资源消费者的角度控制缓存行为。它更像是定义应该调整特定资源的缓存策略的例外情况。如果您检查RFC7234,大多数“请求缓存控制指令”indicates that the client is willing to...indicates that the client is unwilling to...

另外,由于请求头只能在某些情况下配置(例如 Ajax),因此对于许多 HTTP 请求来说,“缓存请求指令”并不存在。例如,解析 HTML 文件后,将创建许多 HTTP 请求来获取静态资源(图像文件、css 文件等),无法Cache-Control在程序中手动为这些请求配置标头。

如果我已经有“缓存请求指令”,那么“缓存响应指令”有什么意义?

如果您只有“缓存请求指令”并且从未获取Cache-Control响应标头,则会发生一些问题:

  1. 如果没有Cache-Control响应头,所有资源的缓存行为都由浏览器决定(例如通过LM-Factor算法计算有效时间)。在最坏的情况下,根本就没有缓存。
  2. 对于静态资源(例如图片文件、css文件),由于无法Cache-Control在请求中进行配置,因此失去了缓存控制能力。


Rei*_*Rei 5

我假设您是作为应用程序开发人员询问的,如果是这样,您不应该打扰您的应用程序在请求中收到的任何 Cache-Control 标头。

为什么?因为该 Cache-Control 标头用于在请求到达您的应用程序之前进行缓存。它不适用于您的应用程序。

这在RFC7234 第 5.2 节(强调我的)中进行了解释:

“Cache-Control”标头字段用于为请求/响应链中的缓存指定指令。

标头的目的是告诉缓存如何处理请求。您的应用程序会收到标头,因为它附加到请求中。但仅仅因为你收到它,并不意味着它适合你。

底线:忽略请求中的任何 Cache-Control 标头。

响应中的 Cache-Control 来自您的应用程序,它也用于缓存。您可以使用它来告诉缓存如何处理响应。基本上,您使用标头来指定响应是否可缓存,如果是,则可缓存多长时间。它不仅仅是请求中收到的 Cache-Control 标头的副本。

他们会添加任何东西吗?

是的,他们这样做。响应中的 Cache-Control 告诉缓存该响应是否可缓存,如果是,它允许缓存立即使用缓存的响应为等效的请求提供服务。从客户端的角度来看,这会减少应用程序的负载并缩短响应时间。

RFC7234 第 4.2 节指出:

当一个响应在缓存中是“新鲜的”时,它可以用来满足后续的请求,而无需联系源服务器,从而提高效率。

你的下一个问题:

如果没有它们,我的应用程序会运行吗?

这取决于。如果您的应用程序没有为不得缓存的响应添加适当的 Cache-Control 标头,则未来的请求可能会收到过时的响应。因此,我建议至少添加Cache-Control: no-cache到不得缓存的响应中。

在评论部分对您的问题进行补充说明

标头通常应该来自您的后端,而不是您的前端。这允许缓存准确地加速对后端的请求,并使前端请求代码保持简单。有一个例外:如果后端不是您的并且其响应新鲜度策略与您的要求不符。

一个示例场景可能是有序的:

假设除了向您自己的后端发送请求之外,您的前端还向其他人的后端发送请求。此特定后端通过发送Cache-Control: max-age=300或适当的 Expires 标头指定其响应最多可缓存 5 分钟。

假设您希望响应不超过 10 秒陈旧,因为 5 分钟对您来说太陈旧了。

由于后端不是你的,你不能改变5-minutes指令,但你可以发送你的请求,Cache-Control: max-age=10从而在缓存响应超过 10 秒时强制缓存获取新的响应,尽管5 分钟来自后端的指令。

这是从您的前端发送 Cache-Control 标头的适当情况:后端不是您的,其响应新鲜度策略与您的要求不符。