我可以自定义标题吗?
我通过使用varnish-devicedetect之类的设备将用户代理分组并存储在X-UA-Device
上的请求和响应中。
我在User-Agent上看到了几个建议。 任何原因不要改变X-UA-Device
? 似乎它对下游缓存更好。
由于X-UA-Device
在客户端请求或任何下游代理服务器(它在Varnish中生成)上不可用,因此必须在原始Vary
标头上进行更改。
虽然X-UA-Device
上的变化对于下游缓存不正确,但是如果您在vcl_deliver
重写Vary标头,Varnish本身仍可以从该优化中vcl_deliver
:
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
响应头,还是希望它能被下游缓存识别。)
上一篇: Can I Vary on a custom header?
下一篇: How to save transfer cache to a different host from a docker