我试图告诉nginx永远caching我的一些资源(js,css),或者至less在很长一段时间。
这个想法是,一旦资产包被编译并且以/assets/
URI前缀(例如/assets/foo-{fingerprint}.js
)发布,它/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,images)而言,您可以告诉浏览器在没有任何条件获取验证的情况下立即提供服务。 如果发生更改,则更新文件名是有帮助的。
这部分配置使得它发生:
add_header Cache-Control public; add_header Last-Modified ""; add_header ETag "";