Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ';变化:如果不匹配';分别缓存移动和桌面请求_Ruby On Rails_Heroku_Varnish_Http Caching - Fatal编程技术网

Ruby on rails ';变化:如果不匹配';分别缓存移动和桌面请求

Ruby on rails ';变化:如果不匹配';分别缓存移动和桌面请求,ruby-on-rails,heroku,varnish,http-caching,Ruby On Rails,Heroku,Varnish,Http Caching,注意:如果我的任何假设是错误的,请纠正我。我对这些都不是很确定 我一直在Heroku上玩HTTP缓存,并试图解决这个问题 使用Varnish缓存时区分移动和桌面请求的好方法 在希罗库 我的第一个想法是,我可以设置一个Vary头,这样如果没有匹配的,缓存就会在上变化。随着Rails自动发回由内容散列生成的etag,etag在桌面和移动请求(不同的模板)之间会有所不同,因此它最终会缓存两个版本(不是事实,只是我最初的想法)。我一直在玩这个,但我认为它不起作用 首先,当/如果任何东西被缓存为的请求时,

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

我一直在Heroku上玩HTTP缓存,并试图解决这个问题 使用Varnish缓存时区分移动和桌面请求的好方法 在希罗库

我的第一个想法是,我可以设置一个
Vary
头,这样如果没有匹配的
,缓存就会在
上变化。随着Rails自动发回由内容散列生成的etag,etag在桌面和移动请求(不同的模板)之间会有所不同,因此它最终会缓存两个版本(不是事实,只是我最初的想法)。我一直在玩这个,但我认为它不起作用

首先,当/如果任何东西被缓存为
的请求时,如果没有匹配的
将是有条件的,我就无法回过头来思考了?第二,在实践中,新的请求(如果不匹配,则没有)有时会接收移动站点。这是因为缓存不知道如果没有匹配的
头,是否将移动或桌面缓存版本作为
提供

听起来,我很困惑。这种方法会起作用吗?还是我太傻了?另外,如果我根本无法访问Varnish配置(就像我在Heroku上一样),是否还有其他方法来实现单独的缓存版本

我在Rails中用于设置缓存头的确切代码是:

response.headers['Cache-Control'] = 'public, max-age=86400'
response.headers['Vary'] = 'If-None-Match'

编辑:我知道我可以使用
Vary:User-Agent
,但是如果可能的话尽量避免使用,因为它有很高的未命中率(很多很多用户代理)。

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


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

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


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

您是否尝试过
Vary:User Agent
?因为我使用Heroku,所以无法更改Varnish的配置。用户代理将工作,但我正试图避免你所说的原因。将用该选项更新问题。抱歉:(.也许您可以插入机架中间件来设置X-Is-Mobile?