【问题标题】:Indefinitely caching a HTTP response via Nginx fails通过 Nginx 无限期缓存 HTTP 响应失败
【发布时间】:2013-11-15 19:26:55
【问题描述】:

我试图告诉 nginx 永久缓存我的一些资产(js、css),或者至少缓存很长时间。

这个想法是,一旦使用 /assets/ URI 前缀(例如 /assets/foo-{fingerprint}.js)编译和发布资产包,它就会保留在那里并且永远不需要更改。

互联网告诉我我应该写以下规则:

location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
  gzip_static on; # there's also a .gz of the asset
  expires max;
  add_header Cache-Control public;
  add_header Last-Modified "";
  add_header ETag "";
  break;
}

我希望这会导致响应 HTTP 代码 304“未修改”,但我得到的是每次都一致的 HTTP 200(OK)。

我尝试了一些其他的方法,例如:

a) 将修改时间显式设置为过去的恒定时间点;

add_header Last-Modified "Thu, 01 Jan 1970 00:00:00 GMT";

b) 切换到If-None-Match 检查;

add_header ETag $1;
if_modified_since off;

但是,唯一真正按需要起作用的是:

add_header Last-Modified "Thu, 01 Jan 2030 00:00:00 GMT";
if_modified_since before;

我迷路了。这与我认为正确的一切背道而驰。请帮忙。

【问题讨论】:

    标签: http caching nginx last-modified if-modified-since


    【解决方案1】:

    你应该改变你的互联网,因为它们会给你错误的建议。

    只需从您的位置删除所有add_header 行(以及多余的brake):

    location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
       gzip_static on; # there's also a .gz of the asset
       expires max;
    }
    

    并从真正的互联网阅读文档:http://nginx.org/r/expireshttps://www.rfc-editor.org/rfc/rfc2616

    【讨论】:

    • 谢谢,有一个例外:只要资产是touched,缓存就会被破坏。我不希望缓存被破坏。是否可以让 Nginx 忽略/覆盖服务资产的mtime
    • 关于我的 Web 设置的一点是,我正在部署到多个服务器并在每次部署时同步 mtime,因为我的旧缓存清除方法基于 mtime。现在我正在尝试转向基于指纹的缓存破坏,但是会有一个过渡期,两种方法都必须工作,所以我必须同步mtimes 在不破坏的情况下提供指纹资产缓存。
    • 无论如何,现在我正在考虑从 mtime 同步中排除新资产,但我认为 FS mtime 只能通过 Last-Modified HTTP 标头破坏缓存并使用 Nginx 规则覆盖它应该已经解决了这个问题。
    • 啊,看来我还是摆脱不了mtime同步,因为对不同服务器的请求会产生不同的Last-Modified值,这将发送不同的If-Modified-Since值,这将随机破坏缓存。所以我又被卡住了。
    • 我似乎已经通过使用您建议的 Nginx 规则和部署时的touch -camt {past_time} {fingerprinted_assets} 找到了解决方案。
    【解决方案2】:

    这似乎是我配置的一部分。在我的研究过程中,我意识到浏览器使用启发式分析来验证带有 ConditionalGet 标头(E-Tag、Last-Modified)的请求。这对后端响应很有意义,因此您可以处理它以节省服务器资源。

    但就静态文件(js、css、图像)而言,您可以告诉浏览器立即提供它们而无需任何条件获取验证。如果发生任何更改,更新文件名会很有帮助。

    这部分配置实现了:

    add_header Cache-Control public;
    add_header Last-Modified "";
    add_header ETag "";
    

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 2017-08-31
      • 1970-01-01
      • 2021-10-21
      • 2011-03-25
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      相关资源
      最近更新 更多