# Keep all these cookie
if (req.http.Cookie) {
set req.http.Cookie = ";" + req.http.Cookie;
set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
set req.http.Cookie = regsuball(req.http.Cookie, ";(location|usertype|viewed-products)=", "; \1=");
set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");
if (req.http.Cookie == "") {
unset req.http.Cookie;
}
}
我有这个 varnish 配置,并且添加了 3 个新 cookie,我需要更改什么吗?据我所知,即使我添加了 3 个新 cookie,用于确定您将从 varnish 接收哪些缓存值的 cookie 也完全由您在配置中保存的 cookie 决定,因此它们将由位置、用户类型和查看的产品决定。由于我们只有 2 个位置、3 个用户类型和 3 个产品,因此我们不能有超过 3 个32 18 种不同的缓存值。我说得对吗?
答案1
您是对的,添加缓存不需要的新 cookie 不会影响您的 VCL 配置。
Varnishlog 输出
如有疑问,请使用varnishlog
。您可以使用以下命令来监视 cookie 行为:
varnishlog -g request -i ReqUrl -I ReqUnset:Cookie -I ReqHeader:Cookie
此命令将仅显示请求的 URL 以及设置和取消设置 cookie 值的各个日志行。
想象一下向您的 Varnish 服务器发送以下 HTTP 请求:
curl -H "Cookie: foo=bar; location=test" http://localhost
该请求向 Varnish 发送了 2 个 cookie:
foo
应该删除的未知cookielocation
应该保留的cookie
以下是日志输出:
* << Request >> 132325
- ReqURL /
- ReqHeader Cookie: foo=bar; location=test
- ReqUnset Cookie: foo=bar; location=test
- ReqHeader Cookie: ;foo=bar; location=test
- ReqUnset Cookie: ;foo=bar; location=test
- ReqHeader Cookie: ;foo=bar;location=test
- ReqUnset Cookie: ;foo=bar;location=test
- ReqHeader Cookie: ;foo=bar; location=test
- ReqUnset Cookie: ;foo=bar; location=test
- ReqHeader Cookie: ; location=test
- ReqUnset Cookie: ; location=test
- ReqHeader Cookie: location=test
正如您所看到的,foo
cookie 被很好地剥离了,但location
cookie 被保留了下来。
控制缓存变化
我看到您正在尝试控制缓存变化的数量,这是有道理的。
问题在于恶意请求可能会产生不必要的缓存变化。
如果每个 cookie 的值数量非常有限,我建议将它们包含在缓存变体逻辑中。
您是否在逻辑中使用 cookie 值来vcl_hash
实现这一点?或者您是否Vary: Cookie
为此使用了 cookie 值?