5

注意:如果我的任何假设是错误的,请纠正我。我对这些都不是很确定...

我一直在研究 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但如果可能的话尽量避免它,因为它有很高的未命中率(很多很多用户代理)。

4

2 回答 2

2

你可以试试Vary: User-Agent。但是,您将拥有单个页面的多个缓存版本(每个用户代理一个)。

另一种解决方案可能是直接在反向代理中检测移动浏览器,在反向代理尝试查找缓存页面之前设置 X-Is-Mobile-Browser 客户端标头,Vary: X-Is-Mobile-Browser在后端服务器上设置 a(这样反向代理将仅缓存同一页面的 2 个版本)并Vary: User-Agent在发送给客户端之前替换该标头。

于 2011-08-15T10:57:31.087 回答
1

如果您无法更改清漆配置,则必须为移动页面和桌面页面创建不同的 url。您可以添加一些 url 参数 ( ?mobile=true),在路径 ( ) 中添加一个片段yourdomain.com/mobile/news或使用不同的主机 (如m.yourdomain.com)。

这很有意义,因为(我在 CMS 和应用程序中都见过很多次)在某个时间点您想要区分移动设备的内容和结构。人们只是在做不同的事情,或者在移动设备上寻找不同的信息……

于 2011-08-15T21:36:17.153 回答