注意:如果我的任何假设是错误的,请纠正我。我对这些都不是很确定...
我一直在研究 Heroku 上的 HTTP 缓存,并试图找出一种在 Heroku 上使用 Varnish 进行缓存时区分移动和桌面请求的好方法。
我的第一个想法是,我可以设置一个Vary
标头,以便缓存是 Varied on If-None-Match
。由于 Rails 自动发回根据内容哈希生成的 etag,etag 在桌面和移动请求(不同的模板)之间会有所不同,因此它最终会缓存两个版本(不是事实,只是我最初的想法)。我一直在玩这个,但我认为它不起作用。
首先,当/如果有任何东西被缓存时,我无法理解,If-None-Match
因为无论如何请求肯定是有条件的?其次,在实践中,新请求(没有 If-None-Match 的请求)有时会收到移动站点。这是因为缓存不知道是否提供移动或桌面缓存版本,因为If-None-Match
标题不存在?
可能听起来,我很困惑。这种方法会以任何方式起作用还是我很傻?另外,如果我根本无法访问 Varnish 配置(就像我在 Heroku 上一样),是否有实现单独的缓存版本?
我在 Rails 中用来设置缓存头的确切代码是:
response.headers['Cache-Control'] = 'public, max-age=86400'
response.headers['Vary'] = 'If-None-Match'
编辑:我知道我可以使用Vary: User-Agent
但如果可能的话尽量避免它,因为它有很高的未命中率(很多很多用户代理)。