【问题标题】:Cache-Control HTTP Headers precedence缓存控制 HTTP 标头优先级
【发布时间】:2017-06-01 08:25:32
【问题描述】:
我读过这篇关于 Cache-Control HTTP Headers 的优秀文章:https://www.mnot.net/cache_docs/#CACHE-CONTROL
我想知道以下标题会发生什么:
Cache-Control: no-store, public
public 标头是否会优先于 no-store 标头,反之亦然?
优先的标头会因浏览器而异吗?
我知道同时拥有 no-store 和 public Cache-Control 标头可能是不可取的,但为了争论,如果它们都存在会发生什么。
提前感谢您的任何指导。
【问题讨论】:
标签:
http-headers
cache-control
【解决方案1】:
从下面的Google Chrome Browser 中找到有关此问题的一些主要代码。
isPubliclyCacheable: function(resource)
{
if (this._isExplicitlyNonCacheable(resource))
return false;
if (this.responseHeaderMatch(resource, "Cache-Control", "public"))
return true;
return resource.url.indexOf("?") == -1 && !this.responseHeaderMatch(resource, "Cache-Control", "private");
}
_isExplicitlyNonCacheable: function(resource)
{
var hasExplicitExp = this.hasExplicitExpiration(resource);
return this.responseHeaderMatch(resource, "Cache-Control", "(no-cache|no-store|must-revalidate)") ||
this.responseHeaderMatch(resource, "Pragma", "no-cache") ||
(hasExplicitExp && !this.freshnessLifetimeGreaterThan(resource, 0)) ||
(!hasExplicitExp && resource.url && resource.url.indexOf("?") >= 0) ||
(!hasExplicitExp && !this.isCacheableResource(resource));
}
根据代码,一些指令比另一个指令具有更高的优先级,“no-store”就是其中之一,因此在您的情况下(缓存控制:“public,no-store”或“no-store,public” ) no-store 将获得更高的优先级。
【解决方案2】:
通过the RFC 7234。给定:
Cache-Control: no-store, public
no-store 是响应缓存控制指令 (RFC 7234, Section 5.2.2)。它声明不应存储响应。
public 是一个扩展。
Cache-Control 头域可以通过使用一个来扩展
或多个缓存扩展令牌,每个令牌都有一个可选值。一个缓存
必须忽略无法识别的缓存指令。
由于public 不是no-store 的已知扩展,它被忽略了。
【讨论】:
-
虽然no-store 优先(参见我的answer)是真的,但public 指令是cache-control 扩展是错误的。 immutable、stale-while-revalidate 和 stale-if-error,这些是扩展。
【解决方案3】:
我已经缩短了与您的用例相关的 HTTP 缓存规范部分(请参阅 https://www.rfc-editor.org/rfc/rfc7234#section-3):
缓存不得存储对任何请求的响应,除非:
“no-store” 缓存指令(参见第 5.2 节)不出现
在请求或响应标头字段中,和
回复:
包含一个缓存控制扩展(参见第 5.2.3 节),它
允许它被缓存,或者包含一个公共响应指令(参见第 5.2.2.5 节)。
包含一个 public 响应指令(参见第 5.2.2.5 节)。
简而言之,no-store 优先于 public。