caching - Varnish - 如何缓存登录用户

标签 caching varnish varnish-vcl

我安装了 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/

相关文章:

caching - 如何清除 APCu 中的用户缓存?

android - 保存外部缓存文​​件

linux - Varnish 无法以 : failed to map segment from shared object: Operation not permitted 开头

apache - Varnish 根据请求的文件是否存在在后端之间进行选择的好方法

java - 缓存使用多个参数构建的对象

sql-server - 强制 SQL Server 将整个数据库预缓存到内存中

node.js - 如何将某些 URL 模式路由到特定端口?

synchronization - 同步多个 Varnish 缓存服务器

varnish - 什么是 Varnish 中的管道模式和传递模式

varnish - 在 Varnish 4 中错误获取后,在 "probe"标记服务器不健康之前交付过时的内容