我安装了 varnish,一切正常。
但是,我需要缓存登录用户。这是我的 VCL 中的内容:
backend default {
.host = "127.0.0.1";
.port = "8080";
}
sub vcl_recv {
unset req.http.Cookie;
if (req.http.Authorization || req.http.Cookie) {
return (lookup);
}
return (lookup);
}
sub vcl_fetch {
unset beresp.http.Set-Cookie;
set beresp.ttl = 24h;
return(deliver);
}
以上有效,但用户可以查看其他用户数据,例如假设我以 Sam 的身份登录并访问页面 A。当另一个用户(例如 Angie)登录并打开页面 A 时,她看到的内容与 Sam 相同。
有没有一种方法可以将页面限制为实际有权查看该页面的登录用户?
我的请求头如下:
Request Headersview source
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Authorization Basic YWRtaW46YWRtaW4=
Connection keep-alive
Cookie tree-s="eJzTyCkw5NLIKTDiClZ3hANXW3WuAmOuRKCECUjWFEnWIyIdJGvGlQgEegAD3hAj"; __ac="0zVm7PLtpaeQUXtm9BeYrC5%2BzobmBLPQkjRtxjyRGHs1MGY1MTgzZGFkbWluIQ%3D%3D"; 'wc.cookiecredentials'="0241d135445f7ca0b1cb7aced45da4e750f5414dadmin!"
我可以使用请求 header 上的 Authorization
条目来强制执行此限制吗?
最佳答案
您的 VCL 当前正在做的是从请求 header 中删除 Cookie 并缓存所有请求。这会导致您描述的确切行为:第一个页面加载被缓存,所有后续用户都获得缓存的内容 - 无论是谁发出请求。通常,您只想为未登录的用户缓存内容。
您不能使用 Varnish 进行授权或访问控制。这需要由后端处理。为此,您需要识别包含相关 session 信息的 cookie,如果定义了 session 则保留 cookie,在其他情况下删除 cookie。
例如:
sub vcl_recv {
if(req.http.Cookie) {
# Care only about SESSION_COOKIE
if (req.http.Cookie !~ "SESSION_COOKIE" ) {
remove req.http.Cookie;
}
}
}
这样,所有包含“SESSION_COOKIE”cookie 的请求都将被传递到后端,而尚未登录的用户会收到来自 Varnish 的缓存副本。
如果你也想使用 Varnish 对登录用户进行缓存,我建议你看一下 Varnish's ESI features .
关于caching - Varnish - 如何缓存登录用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14341749/