Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 我可以更改自定义标题吗?_Http_Varnish_Http Caching_Distributed Caching - Fatal编程技术网

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
。我会编辑以记录这一点。