缓存控制HTTP标头优先级

时间:2017-01-17 10:12:14

标签: http-headers cache-control

我已经阅读了有关缓存控制HTTP标头的优秀文章:https://www.mnot.net/cache_docs/#CACHE-CONTROL

我想知道以下标题会发生什么:

Cache-Control: no-store, public

公共标题是否优先于no-store标题,反之亦然?

优先级的标题会因浏览器而异吗?

我理解同时拥有无存储和公共Cache-Control标头可能并不可取,但为了论证,如果它们都存在会发生什么。

提前感谢任何指导。

3 个答案:

答案 0 :(得分:2)

从下面的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”就是其中之一(Cache-Control:“public,no-store”或“no-store,public”) )no-store将获得更高的优先级。

答案 1 :(得分:1)

通过the RFC 7234。给出:

Cache-Control: no-store, public

no-store是响应缓存控制指令(RFC 7234, Section 5.2.2)。它声明不应存储响应。

public扩展程序

  

可以通过使用一个来扩展Cache-Control头字段      或更多缓存扩展令牌,每个令牌都有一个可选值。缓存      必须忽略无法识别的缓存指令。

由于public不是no-store的已知扩展名,因此会被忽略。

答案 2 :(得分:0)

我已经缩短了HTTP缓存规范中与您的用例有关的部分(请参见https://tools.ietf.org/html/rfc7234#section-3):

  

缓存不得存储对任何请求的响应除非

     

“不存储” 缓存指令(请参阅第5.2节)未出现         在请求或响应标题字段中,

     

响应之一:

     

包含一个缓存控制扩展(请参阅第5.2.3节),该扩展            允许将其缓存或包含公共响应指令(请参见5.2.2.5节)。

     

包含一个 public 响应指令(请参见第5.2.2.5节)。

简而言之,no-store的优先级高于public