我试图告诉 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(正常)。

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

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;

我迷路了。这与我认为正确的一切相反。请帮忙。

有帮助吗?

解决方案

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

只需删除所有 add_header 从您所在位置出发的线路(以及剩余线路) brake):

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

并阅读来自真实互联网的文档: http://nginx.org/r/expireshttp://tools.ietf.org/html/rfc2616

其他提示

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

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

这部分配置使其发生:

add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top