繁体   English   中英

使用Cookie标头使Varnish忽略请求

[英]Make Varnish ignore requests with Cookie header

清漆默认行为是永远不会查找包含Cookie标头的请求。 换句话说,永远不会缓存包含Cookie标头的请求。 我需要覆盖此行为以忽略具有Cookie标头的请求。

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

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

删除Cookie 将不起作用,因为当用户返回/not-cacheable路由时,他将看不到他的个性化页面,因为Cookie标头已被条带化。 相反,后端返回一个新生成的会话,其中包含Set-Cookie的新ID。

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

如果有一种方式告诉Varnish只是忽略Cookie标头,这样我就可以通过让后端决定请求是否应该是可缓存的来缓存具有该标头的请求。

有任何想法吗?

为了记录,我终于想出了一个VCL脚本,它使用自定义标头解决了这个问题并重新启动了请求:

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标头并在我们从后端获得不可缓存的响应时重新启动请求,我们可以实现所需的效果。 我不知道可能的性能缺点,但我在生产中使用它并且它工作得很好。

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

我认为删除vcl_recv的cookie头应该可以解决问题,这是我在wordpress上用来忽略前端而不是后端的东西,你可以轻松删除if条件使其在整个服务器上运行

sub vcl_recv {
  if (req.url !~ "^/wp-"){
    unset req.http.cookie;
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM