我正在使用诸如 varnish-devicedetect 之类的东西按设备对用户代理进行分桶,并将结果存储在请求和响应的X-UA-Device
中。
我已经看到了几个建议,可以在用户代理上有所不同。 有什么理由不改变X-UA-Device
? 似乎下游缓存会更好。
由于 X-UA-Device
在客户端请求或任何下游代理中不可用(它在 Varnish 内部生成),因此您必须更改原始User-Agent
标头。
尽管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
响应标头是为了客户端脚本,还是希望它能被下游缓存识别。