如果我已经拥有"缓存请求指令,"什么是"缓存响应指令。"他们添加了什么吗?没有它们我的应用程序是否会运行相同的程序?
我正在寻找证明"缓存响应指令"是多余的。如果它们是多余的,我不会打扰它们。
GC _
答案 0 :(得分:3)
我假设您要求作为应用程序开发人员,如果是这样,您不应该为应用程序在请求中收到的任何Cache-Control标头打扰。
为什么呢? 因为Cache-Control标头在请求到达应用程序之前用于缓存。 它不适合您的应用。
在RFC7234 Section 5.2(强调我的)中解释了这一点:
“Cache-Control”标头字段用于指定请求/响应链中缓存的指令。
标题的目的是告诉缓存如何处理请求。 您的应用程序收到标头,因为它附加到请求。 但仅仅因为你收到它,并不意味着它适合你。
底线:忽略请求中的任何Cache-Control标头。
响应中的缓存控制来自您的应用程序,它也适用于缓存。 您可以使用它来告诉缓存如何处理响应。 基本上,您使用标头指定响应是否可缓存以及是否可以缓存多长时间。 它不仅仅是请求中收到的Cache-Control标头的副本。
他们添加了什么吗?
是的,他们这样做。 响应中的缓存控制告诉缓存响应是否可缓存,如果是, 它允许缓存通过缓存响应立即提供等效请求。 从客户的角度来看,这可以减少应用程序的负载并缩短响应时间。
当缓存中的响应为“新鲜”时,它可用于满足后续请求,而无需联系原始服务器,从而提高效率。
你的下一个问题:
没有它们,我的应用程序是否会运行相同的程序?
这取决于。
如果您的应用程序没有为不能缓存的响应添加适当的Cache-Control标头,则将来的请求可能会收到过时的响应。
因此,我建议至少将Cache-Control: no-cache
添加到不得缓存的响应中。
在评论部分对您的问题进行补充说明
标题通常应来自您的后端,而不是您的前端。 这允许缓存准确地加速对后端的请求,并使前端请求代码保持简单。 有一个例外:如果后端不是您的,并且其响应新鲜度政策与您的要求不符。
示例场景可能是有序的:
让我们说,除了向您自己的后端发送请求之外,您的前端还会向其他人的后端发送请求。 此特定后端通过发送
Cache-Control: max-age=300
或相应的Expires标头指定其响应最多可缓存5分钟。我们还要说,您希望响应时间不超过10秒,因为5分钟对您来说太陈旧了。
由于后端不是您的,您无法更改 5分钟指令,但您可以使用
Cache-Control: max-age=10
发送请求,从而迫使缓存获取新的响应如果缓存的响应时间超过10秒,尽管来自后端的 5分钟指令。
从您的前端发送Cache-Control标头是适当的情况:后端不是您的,其响应新鲜度政策与您的要求不符。
答案 1 :(得分:2)
是"缓存请求指令"和"缓存响应指令"需要的?
是即可。请求标头中的Cache-Control
和响应标头中的Cache-Control
都是必需的。即使您在请求标头中已经有Cache-Control
,响应中的Cache-Control
也不是多余的。它们是两个不同的东西。根据{{3}}:
缓存指令是单向的,因为请求中存在指令并不意味着在响应中给出相同的指令。
一般来说,响应标头中的 Cache-Control
从资源提供者的角度控制缓存行为。 - 资源是否应存储在缓存中?它有效期多久?如有要求,是否需要重新验证?可以为所有HTTP请求配置响应头,"缓存响应指令"提供了一种为所有资源定义缓存策略的方法。
Cache-Control
从资源使用者的角度控制缓存行为。它更像是定义缓存策略的例外情况应调整具体资源。如果您检查RFC7234,大多数"请求缓存控制指令" indicates that the client is willing to...
或indicates that the client is unwilling to...
此外,由于请求标头只能在某些情况下配置(例如Ajax),而且#34;缓存请求指令"对于许多HTTP请求都不存在。例如,在解析HTML文件之后,将创建许多HTTP请求以获取静态资源(图像文件,css文件等),无法在程序中手动为这些请求配置Cache-Control
标头。
如果我已经拥有"缓存请求指令",那么"缓存响应指令"是什么意思?
如果您只有"缓存请求指令"永远不会得到Cache-Control
响应标题,会出现一些问题:
Cache-Control
响应头,所有资源的缓存行为由浏览器决定(例如,通过LM因子算法计算有效时间)。在最坏的情况下,根本就没有缓存。Cache-Control
,因此您失去了缓存控制功能。