我可以在自定义标头上有所不同吗?



我正在使用诸如 varnish-devicedetect 之类的东西按设备对用户代理进行分桶,并将结果存储在请求和响应的X-UA-Device中。

我已经看到了几个建议,可以在用户代理上有所不同。 有什么理由不改变X-UA-Device? 似乎下游缓存会更好。

由于 X-UA-Device 在客户端请求或任何下游代理中不可用(它在 Varnish 内部生成),因此您必须更改原始User-Agent标头。

尽管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响应标头是为了客户端脚本,还是希望它能被下游缓存识别。

最新更新