散列¶
在内部,当Varnish在缓存中存储由散列键索引的内容时,该散列键用于再次查找对象。在默认设置中,此密钥根据以下公式计算 URL vt.的. Host: 标头,如果没有标头,则显示服务器的IP地址::
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (lookup);
}
正如您所看到的,它首先是散列 req.url 然后 req.http.host 如果它存在的话。值得指出的是,Varnish在散列之前不会将主机名或URL小写,因此从理论上讲,拥有“Varnish.org/”和“varnish.org/”会产生不同的缓存项。然而,浏览器倾向于使用小写的主机名。
您可以更改进入散列的内容。这样,您就可以让Varnish根据任意标准向不同的客户提供不同的内容。
比方说,您希望根据用户的IP地址为其提供不同语言的页面。您需要一些Vmod来获取国家代码,然后将其放入散列中。它可能看起来像这样。
在……里面 vcl_recv **
set req.http.X-Country-Code = geoip.lookup(client.ip);
然后添加一个 vcl_hash **
sub vcl_hash {
hash_data(req.http.X-Country-Code);
}
因为没有 return(lookup) ,内置VCL将负责添加URL, Host: 或者像往常一样将服务器IP号添加到散列。
如果 vcl_hash 确实回来了,即::
sub vcl_hash {
hash_data(req.http.X-Country-Code);
return(lookup);
}
然后 only 国家代码很重要,Varnish将返回看似随机的对象,忽略URL(但它们将始终具有正确的 X-Country-Code )。