我在Varnish 4.0.2中设置了varnish-devicedetect VCL:
https://github.com/varnish/varnish-devicedetect/blob/master/INSTALL.rst
我正在按照方法#1的说明:“将HTTP标头发送到后端”
我已经阅读了这篇自述文件,并且已经使用Google搜索了很长一段时间,但仍然有很多概念在逃避我。
这是我的代码(摘录):
default.vcl
include "devicedetect.vcl";
sub vcl_recv {
call devicedetect;
# ... snip ...
}
sub vcl_backend_response {
# device detect
if (bereq.http.X-UA-Device) {
if (!beresp.http.Vary) { # no Vary at all
set beresp.http.Vary = "X-UA-Device";
} elseif (beresp.http.Vary !~ "X-UA-Device") { # add to existing Vary
set beresp.http.Vary = beresp.http.Vary + ", X-UA-Device";
}
}
# ... snip ...
}
sub vcl_deliver {
# device detect
if ((req.http.X-UA-Device) && (resp.http.Vary)) {
set resp.http.Vary = regsub(resp.http.Vary, "X-UA-Device", "User-Agent");
}
# ... snip ...
}
这是我的问题。
Vary
标头设置为User-Agent
。方法#1的整个方法不是不使用用户代理,而是使用X-UA-Device?call devicedetect
只需查看User-Agent,然后将X-UA-Device
标头设置为对后端请求的相应分组。我对其他两个代码块的作用感到有些困惑。X-UA-Device-force
位吗?Rails:
def detect_device
if request.headers['X-UA-Device'] =~ /^mobile/
@device = 'mobile'
prepend_view_path Rails.root + 'app' + 'views_mobile'
else
@device = 'desktop'
end
end
答案 0 :(得分:1)
对于第1点,您的X-UA设备是内部消费的自定义标头,即默认情况下不会暴露给外部世界。为确保外部缓存/代理了解您正在考虑响应中的设备/用户代理,您必须使用反映此内容的标头更新Vary。这是用户代理进入的地方,就像你从中派生出X-UA-Device那样。
请注明您指明的链接中的评论
要保持任何缓存不会向其后面的客户端#2提供错误的内容,我们需要在出路时改变Vary。