对一些 cookie 进行清漆缓存?

Varnish caching for some cookies?

几个月前我开始使用 Varnish,我的 vcl 文件开始变得复杂。我正在使用相同的 varnish 实例(使用不同的后端)为 5 个不同的站点提供服务,这部分工作正常。

现在我有一些情况,对于某些站点,我需要保留一些 cookie 并根据它们缓存不同的版本。基本场景是仅在用户第一次看到该页面时向他显示一条消息。如果 cookie 不存在,则没有清漆,我会设置它并显示消息。下次 cookie 存在且不显示消息时。

对于清漆,我的逻辑是将 cookie 包含在哈希中并缓存两个不同的版本。挑战在于确保 cookie 设置正确,我在这里有点麻烦。我在我的 vcl 中添加了一些调试消息,但出于某种原因,我没有在 vcl_backend_response 的服务器中看到我设置的 cookie。在例程中,开头有以下代码:

   # AT: DEBUG
   if(bereq.http.x-at-debug == "1") {
     std.log("AT DEBUG - bereq URL: " + bereq.url + ". Cookies: '" + bereq.http.Cookie + "'");
     std.log("AT DEBUG - beresp set-cookie: '" +  beresp.http.set-cookie + "'");
   }

我根据我的 IP 在 vcl_recv 中设置 x-at-debug header,因此我只能跟踪我的请求。在服务器端,我看到设置了 cookie“__IKUB_AL_Myikub_PopUp”,但在 vcl_backend_response 中没有设置。

中间有什么东西可以剥离 cookie 吗?

问题的核心是 beresp.http.set-cookie 只返回第一个 set-cookie header。如果你有更多,你需要来自 varnish 模块 (https://github.com/varnish/varnish-modules) 的 header 模块。注意,它只对 varnish 4.1 有效。