【问题标题】:Chrome refuses to cache JavascriptChrome 拒绝缓存 Javascript
【发布时间】:2014-07-16 09:43:10
【问题描述】:

我对浏览器缓存相当陌生。我试图让 Chrome 使用查询参数永久缓存任何静态文件(出于缓存破坏目的)。我已经将 Cache-Control 和 Expires 标头设置为未来,这应该足以说“永远缓存这个”。生成的响应头:

HTTP/1.1 200 正常 缓存控制:公共,最大年龄=315360000 连接:保持活动 内容编码:gzip 内容类型:application/x-javascript 日期:格林威治标准时间 2014 年 7 月 16 日星期三 09:29:54 最后修改时间:2014 年 7 月 16 日星期三 03:44:14 GMT 服务器:nginx/1.6.0 传输编码:分块 变化:接受编码

Firefox 和 Safari 似乎对所有 cachebusted(?v= 查询参数)文件都尊重这一点。 Chrome 主要遵循指令,除了 Javascript。大多数情况下,它使用 If-Modified-Since 标头进行请求,而不是从缓存中加载。有时其中一个会从缓存中加载,而另一个会产生导致 304 的请求。通常从新选项卡加载页面时,它会从缓存中加载,但如果您在地址栏中按 Enter 键则不会。

我观察到其他网站使用我认为完全相同的标题,并且文件总是从缓存中加载。即使您进行刷新,它们中的一些也会从缓存中加载。

我知道缓存行为有些不可预测,但我想确保我没有监督导致 Chrome 这样做的事情?

【问题讨论】:

    标签: google-chrome caching nginx


    【解决方案1】:

    我在使用 chrome 时遇到了同样的问题,经过几个小时的反复试验后我发现,chrome 似乎有 Vary Header 的问题

    我的 Apache / .htaccess 配置中有这个 sn-p,只要我评论“Header append Vary Accept-Encoding”行,Chrome 就会开始缓存 .js 和 .css 文件

      <FilesMatch "(\.js\.gz|\.css\.gz)$">
      # Serve correct encoding type.
      Header set Content-Encoding gzip
      # Force proxies to cache gzipped & non-gzipped css/js files separately.
      #Header append Vary Accept-Encoding
    </FilesMatch>
    

    通过我们的 nignx 服务器运行请求时它仍然无法正常工作,因为它在交付 gzip 压缩文件时也添加了 Vary: Accept-Encoding 标头。

    到目前为止,我可以猜测这是仅在 chrome 上发生的问题,作为一种解决方法,我将更改配置以仅在 chrome(尚未检查 safari)不是客户端时才附加标头,直到有更好的修复:

    <FilesMatch "(\.js\.gz|\.css\.gz)$">
      # Serve correct encoding type.
      Header set Content-Encoding gzip
      # Force proxies to cache gzipped & non-gzipped css/js files separately.
      BrowserMatch "Chrome" ChromeFound
      Header append Vary Accept-Encoding env=!ChromeFound
    </FilesMatch>
    

    【讨论】:

    • 我也遇到了这个问题,从浏览器响应中删除 Vary 标头很好地解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2016-06-13
    • 1970-01-01
    相关资源
    最近更新 更多