通过Nginx无限期缓存HTTP响应失败

通过Nginx无限期缓存HTTP响应失败,http,caching,nginx,last-modified,if-modified-since,Http,Caching,Nginx,Last Modified,If Modified Since,我试图告诉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; a

我试图告诉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) 如果不匹配,切换到
检查

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
):


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

但就静态文件(js、css、图像)而言,您可以告诉浏览器直接为它们提供服务,而无需任何条件Get验证。如果在发生任何更改时更新文件名,这将非常有用

这部分配置使其得以实现:

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

谢谢,只有一个例外:只要资产
touch
ed,缓存就会被破坏。我不希望缓存被破坏。是否有可能使Nginx忽略/覆盖所服务资产的
mtime
?我的web设置的问题是,我正在部署到多个服务器,并在每次部署时同步
mtime
,因为我的旧缓存破坏方法基于
mtime
。现在我正试图转移到基于指纹的缓存破坏,但这两种方法都必须起作用的过渡期,因此我必须同步
mtime
s并在不破坏缓存的情况下提供指纹资产。无论如何,现在我正在考虑从
mtime
同步中排除新资产,但是我认为FS
mtime
只能通过
Last Modified
HTTP头破坏缓存,用Nginx规则覆盖缓存应该可以解决这个问题。啊,看来我还是无法摆脱
mtime
sync,因为对不同服务器的请求会产生不同的
Last Modified
值,如果自值被修改,将发送不同的
,这将随机破坏缓存。所以我再一次陷入困境。我似乎已经找到了一个解决方案,使用了您建议的Nginx规则和部署时的
touch-camt{pass\u time}{fingerprinted\u assets}
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";