如何在 nginx 中缓存图像,但允许覆盖缓存?

如何在 nginx 中缓存图像,但允许覆盖缓存?

我正在尝试在 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 对待它的方式不同,但似乎他们确实如此。

相关内容