我正在使用类似varnish-devicedetect之类的设备来分销用户代理,并将结果存储在X-UA-Device
请求和响应中。
我见过几个recommendations to vary on User-Agent。有什么理由不改变X-UA-Device
吗?看起来它对下游缓存更好。
答案 0 :(得分:3)
由于X-UA-Device
在客户端请求或任何下游代理中都不可用(它是在Varnish中生成的),因此您必须改变原始Vary
标题。
答案 1 :(得分:0)
虽然X-UA-Device
上的变化对于下游缓存不正确,但如果您在vcl_deliver
中重写Vary标头,Varnish本身仍然可以从优化中受益:
sub vcl_deliver {
if (resp.http.Vary) {
set resp.http.Vary = regsub(resp.http.Vary,
"(?i)X-UA-Device",
"User-Agent");
}
}
这样,Varnish会在X-UA-Device
上更改其缓存,而下游缓存会因User-Agent
而异。
在您的问题中,您提到您要将X-UA-Device
添加到响应标头以及请求标头中。在这种情况下,上述建议无效,您需要无条件发送Vary: User-Agent
:
sub vcl_fetch {
set beresp.http.X-UA-Device = req.http.X-UA-Device;
if (!beresp.http.Vary) {
set beresp.http.Vary = "User-Agent";
} elsif (beresp.http.Vary !~ "(?i)User-Agent") {
set beresp.http.Vary = beresp.http.Vary + ", User-Agent";
}
}
(我不确定您是为了客户端脚本的好处设置X-UA-Device
响应标头,还是希望下游缓存能够识别它。)