我可以改变自定义标题吗?

时间:2014-01-11 00:04:59

标签: http varnish http-caching distributed-caching

我正在使用类似varnish-devicedetect之类的设备来分销用户代理,并将结果存储在X-UA-Device请求和响应中。

我见过几个recommendations to vary on User-Agent。有什么理由不改变X-UA-Device吗?看起来它对下游缓存更好。

2 个答案:

答案 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 响应标头,还是希望下游缓存能够识别它。)