通过 Nginx 无限期缓存 HTTP 响应失败
-
20-12-2019 - |
题
我试图告诉 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/expires 和 http://tools.ietf.org/html/rfc2616
其他提示
这似乎是我配置的一部分。在我的研究过程中,我意识到浏览器使用启发式分析来验证带有 ConditionalGet 标头(E-Tag、Last-Modified)的请求。这对于后端响应很有意义,因此您可以处理它以节省服务器资源。
但就静态文件(js、css、图像)而言,您可以告诉浏览器立即提供它们,而无需任何条件获取验证。如果发生任何更改,更新文件名会很有帮助。
这部分配置使其发生:
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
不隶属于 StackOverflow