實質上,當Varnish存儲內容在緩存中時,它也把如何發現這個對象的哈希鍵和對象一塊兒存儲。默認設置的hash鍵是基於內容的的主機名或者ip地址和URL計算出的。(url+host或者url+ip)git
默認的VCL:github
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存在的話檢查req.http.host。算法
須要指出的是在哈希以前varnish不會將hostname或者URL轉換成小寫,所以「Varnish.org/」和「varnish.org/」理論會致使不一樣的緩存條目。然而,瀏覽器,每每小寫主機名。瀏覽器
你能夠修改hash。這種方式你能夠讓Varnish根據任意算法提供不一樣的內容給不一樣的客戶端。緩存
你若是想基於源ip地址提供不一樣語言的頁面給你的用戶。你須要一些根據ip地址判斷是哪一個國家的VMOD,而後放在哈希中。看起來像這樣:url
In vcl_recv:spa
set req.http.X-Country-Code = geoip.lookup(client.ip);
而後在vcl_hash中增長:code
sub vcl_hash { hash_data(req.http.X-Country-Code); }
默認的VCL將增長host和url到hash,儘管咱們沒有作任何事情。小心調用return(lookup),這將停止默認VCL的執行,同時varnish能夠在結束時基於隨機輸入的或多或少的數據。server