gpt4 book ai didi

http - 让 Varnish 忽略带有 Cookie header 的请求

转载 作者:可可西里 更新时间:2023-11-01 15:19:00 25 4
gpt4 key购买 nike

Varnish 默认行为是从不查找包含 Cookie header 的请求。换句话说,包含 Cookie header 的请求永远不会被缓存。我需要重写此行为以忽略带有 Cookie header 的请求。

考虑我的应用程序中的下一个用户行为:

  1. 用户进入应用程序主页 (/),页面应该被缓存,后端返回一个 public 缓存控制,一切正常,页面被 Varnish 缓存。
  2. 用户导航到不可缓存的自定义页面 (/not-cacheable),后端返回一个 private 缓存控制。还在响应中返回一个 Set-Cookie header 。 Varnish 忽略了这个请求,用户最终得到了一个 cookie。到目前为止一切顺利。
  3. 用户导航回主页 (/),请记住,该主页已被缓存。问题是,用户请求现在带有一个 Cookie header 。这会导致 Varnish 忽略请求并委托(delegate)给后端。

删除 Cookie 不会起作用 因为当用户返回到 /not-cacheable 路由时,他将看不到他的个性化页面,因为 Cookie header 已被删除。相反,后端返回一个新生成的 session ,在 Set-Cookie 中有一个新的 id。

此外,让每个 Cookie 请求都在 Varnish 中查找会导致每个请求(关于方法或后端响应)都被缓存。

如果有某种方式告诉 Varnish 忽略 Cookie header ,这样我就可以缓存带有该 header 的请求,让后端决定请求是否应该被缓存。

有什么想法吗?

最佳答案

仅作记录,我最终想出了一个 VCL 脚本,该脚本使用自定义 header 并重新启动请求来解决此问题:

backend default
{
.host = "127.0.0.1";
.port = "8080";
}

sub vcl_recv
{
if(req.http.X-Force-Backend)
{
return(pass);
}

if(req.http.Cookie && req.request ~ "(GET|HEAD)")
{
set req.http.X-Cookie = req.http.Cookie;
remove req.http.Cookie;

return(lookup);
}
}

sub vcl_deliver
{
if(resp.http.Cache-control ~ "(private|no-cache|no-store)"
&& !req.http.X-Force-Backend
&& req.request ~ "(GET|HEAD)"
)
{
set req.http.X-Force-Backend = "YES";
set req.http.Cookie = req.http.X-Cookie;

remove req.http.X-Cookie;

return(restart);
}
}

如您所见,当我们从后端收到不可缓存的响应时,始终删除 Cookie header 并重新启动请求,我们可以达到预期的效果。我不知道可能存在的性能缺陷,但我在生产中使用它并且效果很好。

我还写了一篇关于这个具体问题的博文,如果有人也在使用 Symfony 和 Varnish,它可能会很有趣:http://albertofem.com/post/symfony-varnish-and-http-practical-considerations.html

关于http - 让 Varnish 忽略带有 Cookie header 的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22943519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com