如何使清漆忽略,而不是删除cookie [关闭
题
即使在cookie存在的情况下,我也想使用清漆来缓存某些页面。我需要处理3种可能性:
- 匿名用户正在查看某些页面
- 登录的用户正在查看一些具有轻度自定义的页面。这些自定义都存储在签名的cookie中,并由JavaScript动态填充。未设置各种cookie HTTP标头。
- 登录的用户正在查看一些页面,其中包含来自数据库的自定义数据。设置了各种cookie HTTP标头。
预期的行为将是:
- 缓存页面。这是清漆要处理的最基本情况。
- 缓存页面,不要删除cookie,因为某些JavaScript逻辑需要它。
- 切勿缓存此页面,因为Vary-Cookie信号表明Cookie内容会影响此页面的输出。
我已经阅读了一些有关Varnish的文档,我无法确定这是否是默认行为,或者是否需要在VCL中进行一些设置才能实现它。
解决方案
每个客户端仅是独有的,不一定是cookie。
您想要的是有意义的,并且在清漆中可能是可能的,这只是仔细制作自己的VCL的问题。请注意默认值的以下部分:VCL:
sub vcl_recv {
...
if (req.http.Authorization || req.http.Cookie) {
/* Not cacheable by default */
return (pass);
}
}
sub vcl_hit {
if (!obj.cacheable) {
return (pass);
}
...
}
sub vcl_fetch {
if (!beresp.cacheable) {
return (pass);
}
if (beresp.http.Set-Cookie) {
return (pass);
}
...
}
您必须用自己的逻辑替换这些部分; IE定义您自己的VCL_函数。默认情况下,带有cookie的请求(VCL_RECV)和响应(VCL_Fetch)不可缓存。您最了解您的后端应用程序,应该将通用的缓存逻辑重写为此特定情况。也就是说,您应该定义在这种情况下进行查找,通过或交付。
在您的情况下,您将拥有没有变化的cookie的页面(案例1和2),每个cookie都会由每个人都缓存和共享(带有/没有cookie的请求);只是不要介意vcl_recv中的req.http.cookie。我不会使用不同的cookie缓存页面(案例3),也不会长时间不长,因为它们根本无法共享;在vcl_fetch中进行“通行证”。
不隶属于 StackOverflow