清漆:使每个API密钥对象单独缓存

问题描述 投票:1回答:1

我有Varnish 4安装,我在每个请求的标题中选择一个基于API密钥的后端,例如(我们在vcl_recv中):

if (req.url ~ "/content") {
    # Check for presence of X-Api-Key header
    if ((! req.http.X-Api-Key) || ((! req.http.X-Api-Key ~ "prod-") && (! req.http.X-Api-Key ~ "test-"))) {
        return(synth(403,"Access Denied - API key missing or invalid."));
    }
    if (req.http.X-Api-Key ~ "prod-") {
        set req.backend_hint = PROD.backend();
    }
    if (req.http.X-Api-Key ~ "test-") {
        set req.backend_hint = TEST.backend();
    }
}

但是,从PROD后端获取的对象可以传递给TEST后端的请求,如果它们的TTL未过期,反之亦然。

如何确保每个后端的内容与另一个后端隔离?

varnish varnish-vcl varnish-4
1个回答
2
投票

这个很容易。由于您希望缓存根据特定标题而变化,因此您应该告诉Varnish它。所以要么让你的后端发送Vary: X-Api-Key(最佳路线),要么在那个标题的值上有Varnish hash

sub vcl_hash {
    if (req.http.X-Api-Key) {
        hash_data(req.http.X-Api-Key);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.