我很难决定是否对我的静态文件(.js,.png等)使用Apache的内置ETags或Expires / Cache-Control组合。
我正在运行单服务器设置,没什么特别的。
我基本了解这一切是如何运作的,并且我已经运行了这两种设置,并在过程中调整了不同的东西。
它们看起来非常相似。我能找到的唯一区别是 Apache 的 ETag 不允许您定义组件到期前的时间量。此外,当使用 ETag 时,如果文件未修改,我看到每个组件的新请求都会导致 304。
出于这些原因,我倾向于使用 Expires/Cache-Control 组合,但您认为应该使用哪一个呢?
答案1
这取决于文件更改的频率。如果更改频繁,Expires
/Cache-Control
组合可能会导致客户端获取新内容出现延迟。另一方面,ETag
确保每次请求时都重新验证缓存,这将确保您的客户端始终获取最新内容。
如果您有机会使用多服务器设置,我建议您调整指令FileETag
(INode
至少删除该选项),因为它可能会ETag
在不同的服务器上产生不同的结果。
答案2
这也取决于您如何引用静态内容。我对大多数静态文件设置了 10 年的有效期,但在所有情况下,这些文件都是使用 ?timestamp 查询字符串格式从动态内容引用的。由于这或多或少与使用包含文件时间戳作为标签一部分的 ETag 相同,因此我建议纯静态配置使用 ETag。
还请注意,您现在可以选择 ETag,以后再切换。这无害。您还可以同时执行所有不同的方法。我相信 Ruby on Rails 会执行 if-modified-since dance、etags 和 cache-control,并且可以混合搭配。对于特定的静态配置,我无法想象您需要全部执行,但执行多个配置也没什么坏处。
我要说的是,从缓存中取出远期 Expires 标头非常困难,但其余部分相当容易。这只取决于您愿意承受多少流量,因为从远程缓存中删除最困难的就是流量效率最高的。