我想要使用相同的清漆实例缓存几个网站。
我确实使用类似的东西来设置后端:
if (req.http.host == "time.ikub.al") {
# Process through time backend
set req.backend_hint = timeserver;
}
if (req.http.host == "m.time.ikub.al") {
# Process through time mobile backend
set req.backend_hint = timemobileserver;
}
和哈希方法如下:
sub vcl_hash {
# Called after vcl_recv to create a hash value for the request. This is used as a key
# to look up the object in Varnish.
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
# hash cookies for requests that have them
if (req.http.Cookie) {
hash_data(req.http.Cookie);
}
}
但是,我注意到移动版本的页面在桌面上提供,反之亦然。这发生在具有相同名称的页面上,例如“Default.aspx”。
据我所知,哈希上面的代码应该包含主机部分,这不应该发生。我错过了什么,或者是否有关于如何处理多个网站的建议?
感谢名单, 阿尔伯特
答案 0 :(得分:1)
我认为你已经部分复制了默认的vcl,但是你忘记了return (lookup);
,所以在执行你的代码之后,varnish会执行默认代码,这可能会导致varnish行为不端。
答案 1 :(得分:0)
您的varnish实例是否隐藏在任何其他反向代理,负载均衡器,https offloader之后?
任何前端都可能会破坏主机头,因此这段代码不会执行第一个或第二个条件:
# unset req.http.host or set req.http.host = "my.varnish.backend";
if (req.http.host == "time.ikub.al") {
# Process through time backend
set req.backend_hint = timeserver;
}
if (req.http.host == "m.time.ikub.al") {
# Process through time mobile backend
set req.backend_hint = timemobileserver;
}
所以 req.backend_hint 将不生效并且varnish可以非确定地选择后端。 在重新启动和重新加载后,至少默认后端是不同的。
试着检查这条路径,也许会有所帮助。
答案 2 :(得分:0)
我的印象是“重定向”没有被缓存......但似乎重定向被缓存,而且正在发生的事情是来自桌面版本的重定向响应被缓存,下一个客户端被提供缓存页面以便重定向他移动版本...我将重定向逻辑移动到客户端,事情似乎有效