我正在阅读有关 Azure CDN 的这篇文章。我可以使用以下方法控制缓存:
- ETag
- 上一次更改
- 默认启发式方法
前两种选择各有什么优缺点?这重要吗?
其中一个可能起作用的地方与另一个可能起作用的地方可能是:
- 跨域调用
- 私人浏览
- IFrames
- 阿贾克斯
...其中数据只能通过这些方法看到,而不能通过其他方法看到。
答案1
两者在任何情况下均可使用。
eTag
较新,因此最好使用它而不是last-modified
,但这取决于您。
以下MS Docs
页面解释了哪个系统解释它eTag
优先于哪个:last-modified
https://docs.microsoft.com/en-us/azure/cdn/cdn-how-caching-works#cdn-caching
答案2
让我做两个现实生活中的假设:
ETag
你不能轻易地定制生成或Last-Modified
为你的代码- 你正在提供一些静态文件
考虑到这一点,最明显的区别是,对于文件,您很容易意外或故意更改修改日期,从而更改Last-Modified
标题。(您甚至可以回到较早的日期。)一般情况下,您不会ETag
轻易受到影响。好还是坏?取决于您的用例。如果生成的代码ETag
不错,我会说它更适合一般用例,即开箱即用,无需触摸旋钮。但要知道它是否不错需要测试,尤其是测试升级和降级。
ETag 适用于每秒更改多次的内容(例如:频繁使用的聊天),因为 Last-Modified 仅支持 1 秒的粒度。
压缩响应的 ETag 应由您的服务器重新生成,无法从未压缩的响应中复制。但无论如何,它比压缩占用的 CPU 少得多。
使用 CORS,您可以Last-Modified
免费使用,但eTag
您的服务器需要支持额外的标头Access-Control-Expose-Headers: ETag
(分子动力学)。
答案3
我认为这取决于用例...
例如,如果您有一个页面应该显示任何内容的时间或经过的时间,那么上次修改时间将是最好的解决方案(因为您询问的是时间)。
但是,例如,如果您有动态创建的内容,并且您更改了一些脚本,导致修改日期发生变化,但交付的内容仍然相同。这种情况会导致无用的重新加载缓存,而 eTag 会说“内容相同,因此会产生相同的 eTag。
类似的情况甚至可能发生在静态文件的修改时间发生改变但内容不变的情况下。例如,当你将一些文件复制到新磁盘上时(这会导致时间更新)