我想使用 Varnish 缓存某些页面,即使存在 cookie。我需要考虑以下三种可能性:
- 匿名用户正在浏览某个页面
- 登录用户正在查看一些带有轻度自定义的页面。这些自定义内容都存储在签名的 Cookie 中,并由 Javascript 动态填充。未设置 Varying-cookie http 标头。
- 登录用户正在查看某个页面,其中包含来自数据库的自定义数据。已设置vary-cookie http标头。
预期的行为是:
- 缓存页面。这是 Varnish 处理的最基本场景。
- 缓存页面并且不要删除 cookie,因为某些 Javascript 逻辑需要它。
- 永远不要缓存此页面,因为vary-cookie表示cookie内容将影响此页面的输出。
我已经阅读了一些关于 Varnish 的文档,但我无法判断这是默认行为还是我必须在 VCL 中做一些设置才能实现它。
答案1
默认情况下,Varnish 不会缓存带有 Cookie 标头的请求:
http://varnish-cache.org/svn/trunk/varnish-cache/bin/varnishd/default.vcl
sub vcl_recv {
(...)
if (req.http.Authorization || req.http.Cookie) {
/* Not cacheable by default */
return (pass);
}
return (lookup);
您需要将所需的行为编码到配置中。请注意,Cookie 是客户端请求的一部分,而不是“页面”(实际上是对象)。“页面”(对象)带有“Set-Cookie”标头 - 这就是将被缓存的标头。
另外,“Vary: Cookie”并不意味着“不缓存”。它意味着对收到的每个 Cookie 值都缓存一个对象。
如果你的应用程序没有基于 Cookie 生成任何内容,那么忽略它可能是安全的:
- if (req.http.Authorization || req.http.Cookie) {
+ if (req.http.Authorization) {
做一些测试,你就会掌握窍门。希望这能有所帮助。
答案2
如果我理解正确的话,您不希望特定的 cookie 作为密钥的一部分 - 但您需要保持它完整?
您需要将 vcl_hash 中的哈希设置为 req.url + req.http.host(可能还有其他),但不是特定的 cookie。
我认为我的一篇文章可以帮你找到正确的方向:忽略 Varnish VCL 中的 GET 参数