【问题标题】: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 扩展是错误的。 immutablestale-while-revalidatestale-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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 2011-01-13
        • 2013-04-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 2020-07-23
        相关资源
        最近更新 更多