3

我安装了清漆,一切正常。

但是,我需要缓存已登录的用户。这就是我的 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!"

我可以使用Authorization请求标头上的条目来强制执行此限制吗?

4

2 回答 2

3

您的 VCL 当前正在做的是从请求标头中删除 Cookie 并缓存所有请求。这会导致您描述的确切行为:第一个页面加载被缓存,所有后续用户都获得缓存的内容 - 无论谁发出请求。通常,您只想为尚未登录的用户缓存内容。

您不能使用 Varnish 进行授权或访问控制。这需要由后端处理。为此,您需要识别包含相关会话信息的 cookie,并在定义了会话时保留 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 的 ESI features

于 2013-01-16T11:43:48.893 回答
0

它只能通过 vcl 完成 - 添加 vmod 或内联 C。

一个简单的例子:假设你有三个不同的页面,用于三个不同级别的用户:(未登录、登录、管理员)并且级别存储在 cookie 中。您可以获取 cookie 值并将 get 参数添加到 url:

http://example.com/homepage.html?user_level=none

http://example.com/homepage.html?user_level=logged_in

http://example.com/homepage.html?user_level=admin

(您的 vmod 将处理添加 '?' 或 '&' 以及名称值对到 URL 的末尾。)

所有这些通常都可以在 vmod 中完成,但也可以根据大小来完成,因为内联 C. Vmod 是首选,但内联 C 可以让您启动并运行初始测试 - 然后移至 vmod。

当 vcl_hash() 运行时,它将散列您刚刚修改的 url。Varnish 缓存现在将包含最多三个不同版本的页面。从 Varnish 的角度来看,这是三个不同的缓存对象。您可以为页面的每个变体设置不同的 TTL。

在缓存未命中时,后端 Web 服务器可以忽略您刚刚添加的这个 get 参数,或者您可以在 vcl 中的 vcl_hash() 或 vcl_backend_fetch 中将其删除。您的后端服务器通常会使用 cookie 值,而不是这个 vcl 添加的参数。

总之,您正在更改 URL 参数,以便它针对您需要的不同用户级别进行不同的哈希处理。或者,您可以只更改您的 vcl_hash() 方法以散列 cookie 值,但我发现更改 URL 更好地用于 varnishncsa 日志记录和报告。此外,如果 cookie 是加密的,那么只需修改 URL 参数,就可以使用基本的 cURL 请求更轻松地处理 PURGE 请求。如果发送 PURGE 请求的客户端是授权用户,则您的 PURGE 条件将处理。

于 2016-04-28T14:53:40.003 回答