首先,我想知道这是否可能。
所以,我可以看到如果 Varnish 有 cookie,它就不会缓存对象。
我在考虑当传入请求有 cookie 时,Varnish 会将它们存储在变量中并删除这些 cookie,然后让它通过后端。后端完成处理后,Varnish 会将 cookie 放回。
这是可能的吗?
如果是,vcl 是什么样子的?
首先,我想知道这是否可能。
所以,我可以看到如果 Varnish 有 cookie,它就不会缓存对象。
我在考虑当传入请求有 cookie 时,Varnish 会将它们存储在变量中并删除这些 cookie,然后让它通过后端。后端完成处理后,Varnish 会将 cookie 放回。
这是可能的吗?
如果是,vcl 是什么样子的?
语境
Varnish 在缓存方面比较保守,并假设 cookie 的使用意味着响应的个性化程度。
缓存个性化响应可能会导致隐私或安全问题。它还可能导致输出不一致。
想象一下缓存一个有购物车的页面。缓存整个页面会导致每个人都拥有相同的购物车值。
下面是 Varnish for cookies 的内置 VCL 行为:
Cookie
在请求中看到标头时,它不会从缓存中提供对象,因为它假定内容是个性化的。Set-Cookie
在响应中看到标头时,它不会将对象存储在缓存中,因为设置 cookie 是一种状态更改,也意味着个性化。剥离饼干
一旦通过
Set-Cookie
响应标头设置了 cookie,它将作为Cookie
每个后续请求的请求标头传递,即使对于并不真正需要这些 cookie 的页面也是如此。这就是为什么确定哪些页面需要 cookie 哪些不需要 cookie 很重要。识别跟踪 cookie 同样重要,因为它们由客户端在 Javascript 中处理,而不是在服务器上处理。
这是一个 VCL 示例,我们在其中删除了所有 cookie,除了我们在服务器上需要的那些:
删除某些页面的 cookie
虽然前面的示例的特点是剥离选定的 cookie 并仅保留
PHPSESSID
cookie,但您最终可能仍会访问实际上不需要该会话 cookie 的页面。这是一个 VCL 示例,其中 cookie 被完全剥离,除了在实际需要特定 cookie 的页面上,如管理页面和购物车页面:
删除 Set-Cookie 标头
如https://www.varnish-software.com/developers/tutorials/varnish-builtin-vcl/#dont-cache-responses-with-set-cookie-headers所示,内置 VCL 不会存储对象如果使用标头,则在缓存
Set-Cookie
中,因为它意味着状态更改。然而,这并不意味着页面永远不会在缓存中结束:下一个后端响应可能不会包含
Set-Cookie
标头,因为 cookie 已经设置。在那种情况下,没有Set-Cookie
标头的下一个响应可能会在缓存中结束。但是,如果您确定不需要为某些页面设置 cookie,您也可以决定去掉
Set-Cookie
标题。以下示例阻止后端为静态内容设置 cookie:
重新附加 cookie
虽然可以将 cookie 值存储在标头中,然后在 VCL 中剥离 cookie 以便从缓存中提供服务,最后重新附加后端请求,但这并没有多大意义。
如果可缓存响应不需要 cookie 来创建其输出,为什么要为后端请求发送 cookie?
如果后端请求需要 cookie 值来组成输出,这可能意味着响应将不可缓存,因此您不妨为该请求完全绕过缓存。
下一步
因为你的问题不是很具体,我也不得不给你一个非常笼统的答复。
如果我的回答完全回答了您的问题,我邀请您详细说明您的用例,作为回报,我会给您更详细的答复。