我可以自定义标题吗?

我通过使用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响应头,还是希望它能被下游缓存识别。)

链接地址: http://www.djcxy.com/p/18273.html

上一篇: Can I Vary on a custom header?

下一篇: How to save transfer cache to a different host from a docker