![如何在 nginx 中缓存图像,但允许覆盖缓存?](https://linux22.com/image/711094/%E5%A6%82%E4%BD%95%E5%9C%A8%20nginx%20%E4%B8%AD%E7%BC%93%E5%AD%98%E5%9B%BE%E5%83%8F%EF%BC%8C%E4%BD%86%E5%85%81%E8%AE%B8%E8%A6%86%E7%9B%96%E7%BC%93%E5%AD%98%EF%BC%9F.png)
我正在尝试在 nginx 上向我的文件添加“expires”标头,但允许我们通过在末尾添加查询字符串来覆盖它们。这是我的配置:
location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ {
add_header Vary Accept-Encoding;
expires max;
}
我有一个脚本,可以让人们旋转图像,然后重新加载图像以显示新旋转的图像。我遇到的问题是它并不总是有效!
我们"?dummy="+$.now()
在图像名称的末尾添加,这样通常会强制浏览器再次下载图像。
这个逻辑在我们的 Apache 服务器上运行良好,但我无法让它在 nginx 上正常工作(它似乎只有一半的时间有效)
我是否遗漏了什么?
FWIW:我真的不想重命名图像,因为这意味着我们还必须重命名所有缩略图版本 - 其中有相当多。
以下是图片中的信息:
当你旋转图像时,这个值保持不变(尽管我可以看到一个新的网络请求,并使用新的虚拟=xxx參數)
如果我强制重新加载页面,我会看到以下内容:
因此,“上次修改时间”、“电子标签”等内容正在更新,但由于某种原因,浏览器无法识别它 :/
答案1
我的一个 Nginx 配置中有这个,它可能会给你指明正确的方向。使用“if”并不总是理想的,但对我来说它似乎工作正常。
set $skip_cache 0;
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
if ($skip_cache = 1) {
set $cacheControl "private, max-age=0, s-maxage=0, no-cache, no-store";
}
if ($skip_cache = 0) {
set $cacheControl "public, max-age=86400, s-maxage=86400";
}
location /whatever/ {
add_header Cache-Control $cacheControl;
}
答案2
好吧,这并不能解决我的问题 - 但它确实解决了我遇到的问题。基本上,我现在只是重命名图像,然后将其重新缩放到不同的大小。这远非理想(因为我本来希望保留原始名称),但它已经浪费了我太多时间。我不明白为什么 nginx 和 Apache 对待它的方式不同,但似乎他们确实如此。