2

我试图告诉 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;

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

4

2 回答 2

6

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

只需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

于 2013-11-17T01:28:14.260 回答
-1

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

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

这部分配置使它发生:

add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
于 2014-03-20T15:06:16.920 回答