我在清漆配置中有这段代码,但不确定它的作用!此配置是否会缓存我的客户端请求?有什么问题吗?
sub vcl_backend_response {
if (beresp.status != 200) {
return (pass);
}
set beresp.http.X-Backend = beresp.backend.name;
unset beresp.http.cookie;
unset beresp.http.Set-Cookie;
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
set beresp.http.Cache-Control = "no-store";
}
set beresp.http.Cache-Control = "no-store";
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
return (pass);
}
return (deliver);
}
这段 VCL 代码似乎指定了一些关于何时绕过缓存的规则。然而,它的写法并没有多大意义。
绕过缓存
return(pass)
不是绕过上下文中缓存的正确方法vcl_backend_response
。当传入请求绕过缓存时return(pass)
使用。vcl_recv
绕过
vcl_backend_response
缓存意味着阻止将传入对象存储在缓存中。最佳实践要求您这样做set beresp.uncacheable = true
,分配一个 TTL,然后return(deliver)
。这可以确保该对象在一定时间内绕过缓存,直到下一个后端响应满足所需的条件。我的启用
beresp.uncacheable
,您确保该对象最终出现在等待列表中并成为请求合并的候选者。删除cookie
删除 cookie 通常有助于提高命中率。在后端上下文中,您将删除
Set-Cookie
标头。vcl_backend_response
这是在through中正确完成的unset beresp.http.Set-Cookie
,但是这是无条件完成的。这意味着
Set-Cookie
不会发生任何操作,这可能会导致行为不一致。不确定删除这些 cookie 是否需要先决条件。您还可以通过删除传入的 cookie
unset req.http.Cookie
。vcl_backend_response
但运行中似乎有类似的调用unset beresp.http.Cookie
。这表明
Cookie
将收到响应标头。这似乎不太可能。重写VCL
这就是我在没有任何其他上下文的情况下重写此 VCL 代码的方式: