通过 Imageresizer 从 Azure Blobstore 修改 data/time 传递到 CDN

Pass thru data/time modified from Azure Blobstore to CDN via Imageresizer

我们刚刚使用 Cloudflare 的 CDN 前面的 Imageresizer (v 4.0.5.942) 将我们的图像托管移动到 Azure,但发现当图像在 Azure blobstore 上变回时,CDN 保留了缓存的图像。

我们在传出图像托管上使用了相同的 CF CDN 和 Imageresizer,这是一个带有 Imageresizer 磁盘缓存设置的 iis 框,没有问题。

我们的 Azure imageresizer 配置文件的插件部分是 -

<add name="AzureReader2" prefix="~/"connectionString=
"DefaultEndpointsProtocol=httpsAccountName=reiwastorstagimg
 AccountKey=xyzxyxyyz"`
checkForModifiedFiles="true" />

测试图像是通过 CDN - http://azstagingimage.reiwa.com.au/listing/09/2635009-04.jpg?maxwidth=724&maxheight=543&quality=100

直接到 Imaresizer 应用程序 - http://azstagingimage3.reiwa.com.au/listing/09/2635009-04.jpg?maxwidth=724&maxheight=543&quality=100

本地配置包含 -

<resizer>
    <plugins> 
     <add name="DiskCache" />
    </plugins>


<diskCache autoClean="false" hashModifiedDate="true" subfolders="1024" />
</resizer>

我的想法是,当我们在 prem 上打开磁盘缓存时,Imageresizer 会检查原始图像 date/time 标记,将其与其缓存版本 date/time 进行比较,如果发生更改,将重新处理图像从而改变缓存的图像 date/time 修改的戳记又被 CDN 拾取,导致重新读取。

查看 Imageresizer 文档,我相信 checkForModifiedFiles="true" 会导致 Imageresizer 返回 blob 存储,获取原始文件的修改日期并将其传递给 CF CDN(或浏览器),但我们已设置但未按预期运行。

有谁知道是否有办法解决这个问题,或者我是否也需要在云中打开磁盘缓存?

提前谢谢你。 基隆

ImageResizer 在 v3 中停止提供 "original image" 修改日期(对于已处理的请求)——它看起来无害,但造成了广泛的破坏。不幸的是,某些浏览器和代理将 last-modified 与上次获取日期进行比较。让它表现得像一个 etag 会更好,但事实并非如此。 Last-modified 必须是输出生成的日期,否则将开始出现各种副作用。

如果不启用 DiskCache,checkForModifiedFiles 将没有太大意义。

启用磁盘缓存后,ImageResizer 根据缓存结果的时间提供稳定的修改 date/etag。没有磁盘缓存,ImageResizer 不会发送 last-modified 日期。不过,这通常不会导致 CDN 从不验证,而是相反 - 过于频繁的失效。

ImageResizer 通常与 IIS 和 ASP.NET header 配置配合得很好,在某些配置中,last-modified 总是设置为 utcnow。但这不会发生在您的服务器上。

痛苦最小的途径通常是使用 cache-breakers(如 &r=31512351),或将所有 blob 视为不可变的。 ImageResizer 用户通常无法接受无效检查的高延迟,不可变 blob 方法非常流行。

ImageResizer 在使用 DiskCache 缓存 headers 方面表现不错,但是当没有存储或保存状态的方法时 - 很难有一个不破坏其缓存选择的解决方案。

不过,ImageResizer 可以做得更好。

如果您想要自定义行为,PreSendRequestHeaders 是一个很容易进行更改的地方。如果您想要完全控制,也很容易将 NoCache 和 ClientCache 插件换成您自己的 类。