Http 我可以更改自定义标题吗?
我正在通过设备使用类似于的东西对用户代理进行备份,并将结果存储在请求和响应的Http 我可以更改自定义标题吗?,http,varnish,http-caching,distributed-caching,Http,Varnish,Http Caching,Distributed Caching,我正在通过设备使用类似于的东西对用户代理进行备份,并将结果存储在请求和响应的X-UA-device中 我见过好几个。是否有任何理由不更改X-UA-Device?似乎下游的缓存会更好 由于X-UA-Device在客户端请求或任何下游代理(在Varnish内部生成)中不可用,您必须在原始用户代理头上进行更改。尽管在X-UA-Device上进行更改对于下游缓存是不正确的,如果您在vcl\u deliver中重写Vary头,Varnish本身仍然可以从优化中获益: sub vcl_deliver {
X-UA-device
中
我见过好几个。是否有任何理由不更改
X-UA-Device
?似乎下游的缓存会更好 由于X-UA-Device
在客户端请求或任何下游代理(在Varnish内部生成)中不可用,您必须在原始用户代理
头上进行更改。尽管在X-UA-Device
上进行更改对于下游缓存是不正确的,如果您在vcl\u 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
上改变其缓存,在用户代理上改变下游缓存
在您的问题中,您提到要将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
响应头是为了客户端脚本的好处,还是希望下游缓存能够识别它。)我认为这是错误的,因为vcl\u deliver
是在Varnish本身将对象存储在缓存中之后调用的。如果要缓存同一URL的不同版本,应使用vcl\u哈希
方法是让应用程序在响应头中发送Vary:X-UA-Device
。Varnish将存储该版本的Vary
标题,并根据该版本做出命中/未命中决策。(Varnish确实支持Vary标头,因此不需要额外的vcl_哈希
逻辑。)在vcl_deliver
中将响应标头重写为Vary:User Agent
,以确保任何下游缓存都能正常运行。(注意:我已经对此进行了测试,并确认它适用于Varnish 3.0.5)如果设备检测是在Varnish外部执行的(在应用程序中),那么这是正确的,如果您在Varnish内部执行检测(如原始问题中所示),您应该注意vcl_deliver
上的Vary标题,例如:if(resp.http.Vary){set resp.http.Vary=resp.http.Vary+”,User-Agent”;}另外{set resp.http.Vary=“User-Agent”}
我在原始问题中遗漏了一个细节,那就是他在请求和响应中都添加了X-UA-Device
。我会编辑以记录这一点。