客户联系我们,说我们编写的某个页面上的登录系统存在问题。有时用户会以其他人的身份登录。尽管我们尝试了各种方法,但还是无法重现这种情况。我怀疑这是 Varnish 造成的(因为客户第一次报告此问题时系统管理员已经设置了 Varnish),但我对此没有太多经验,而且我们的系统管理员似乎不愿意提供帮助。
该页面使用静电放电。所有用户特定的包含都根本不缓存,但有一个例外:单独包含的标头中有用户名。我们使用 缓存此 ESI Vary: Cookie
,因此这应该不是问题。
我们在服务器上的设置是 Nginx -> Varnish -> Apache。这是我们的 Varnish 配置。Nginx 不应该缓存任何东西(至少系统管理员声称如此)。
我怀疑 Varnish 配置中存在拼写错误或配置错误。欢迎提供任何提示。
答案1
我怀疑这可能与您的 vcl_hash 函数有关。如果您不需要它,请将其注释掉,然后看看会发生什么——首先在模拟客户端设置的测试服务器中尝试一下。
详情如下:(我对清漆还不熟悉,因此这是我的理解):
varnish 使用这个函数来“标记”缓存内容。根据这里的逻辑,哈希值可以是请求 URL、主机或服务器 IP。如果 user1 出现并登录到 clientapp.com,varnish 会使用主机 clientapp.com 对该页面进行哈希标记。因此,当 user2 出现在同一主机上时,varnish 会根据哈希函数中的规则看到该页面已被缓存,并将缓存页面传递给 user2(而实际上不应该这样做)。如果 user2 通过访问服务器的 IP 地址登录,我敢打赌他们会看到自己的信息。但是,如果 user3 通过 IP 地址登录,他/她将看到 user2 的信息。
sub vcl_hash {
hash_data(req.url); //This is never used 'cos of the lines that follow
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (hash);
}