【问题标题】:Varnish behind load balancer not caching content负载均衡器后面的清漆不缓存内容
【发布时间】:2011-10-26 00:20:20
【问题描述】:

我正在使用此行删除 default.vcl 中的 cookie 以允许 Varnish 缓存

set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|__utma_a2a|has_js|Drupal.toolbar.collapsed|MNO_abc_qrst_\d+)=[^;]*", "");

但它似乎不起作用。

Varnish 在负载均衡器后面,负载均衡器设置了一个持久性 cookie,它以这种格式出现在标头中:

Set-Cookie:MNO_abc_qrst_80=aaaaaaaaa2a5882045525d5a4a58455e445a4a423660;expires=Fri, 12-Aug-2011 17:23:23 GMT;path=/;httponly

我在模拟器中运行了这个正则表达式,它捕获了上面的行(直到第一个“;”)。所以我认为这个正则表达式应该抓住它,但它似乎没有?当我绕过这个负载均衡器时,内容会被缓存。

有什么想法吗?我错过了什么?

【问题讨论】:

    标签: regex varnish varnish-vcl


    【解决方案1】:

    有两种方法可以去,要么验证整行需要被删除,
    或切断线路的违规部分。我不知道您使用的是哪种正则表达式引擎。为了获得更好的结果,至少需要负面的回溯和反向引用。

    压缩验证: /^(?=(Set-Cookie:\s*))(?:\1|.*?;\s*)(?:__[a-z]+|__utma_a2a|has_js|Drupal\.toolbar\.collapsed|MNO_abc_qrst_\d+)=[^;]*(?:;|$).*$/s

    压缩的全局部分替换: s/(?:(?<=^Set-Cookie:)|(?<=;))\s*(?:__[a-z]+|__utma_a2a|has_js|Drupal\.toolbar\.collapsed|MNO_abc_qrst_\d+)=[^;]*(?:;|$)//g

    正则表达式的扩展视图(在 Perl 中):

    my $str = 'Set-Cookie: MNO_abc_qrst_80=aaaaaaaaa2a5882045525d5a4a58455e445a4a423660;expires=Fri, 12-Aug-2011 17:23:23 GMT;path=/;httponly';
    
    ## Validate part of a cookie, remove line
    
    if ( $str =~ /
           ^ (?= (Set-Cookie: \s*))
           (?:  \1
              | .*? ; \s*
           )
           (?:   __[a-z]+
              |  __utma_a2a
              |  has_js
              |  Drupal\.toolbar\.collapsed
              |  MNO_abc_qrst_\d+
           )
           =
           [^;]*
           (?: ; | $)
           .* $
     /sx )
    {
         print "Valid, remove line '$&'\n=============\n\n";
    }
    
    ## Globally, replace many parts of the cookie
    
    if ( $str =~ s/
           (?:   (?<= ^ Set-Cookie:)
              |  (?<= ;)
           )
           \s* 
           (?:    __[a-z]+
               |  __utma_a2a
               |  has_js
               |  Drupal\.toolbar\.collapsed
               |  MNO_abc_qrst_\d+
           )
           =
           [^;]*
           (?: ; | $)
     //xg )
    {
         print "removed parts of cookie\n";
         print "new string = '$str'\n";
    }
    

    输出:

    Valid, remove line 'Set-Cookie: MNO_abc_qrst_80=aaaaaaaaa2a5882045525d5a4a58455e
    445a4a423660;expires=Fri, 12-Aug-2011 17:23:23 GMT;path=/;httponly'
    =============
    
    removed parts of cookie
    new string = 'Set-Cookie:expires=Fri, 12-Aug-2011 17:23:23 GMT;path=/;httponly'
    

    【讨论】:

    • 哇,这会让我的头爆炸。谢谢@sln!
    • @KM:没问题,有任何问题请告诉我。
    猜你喜欢
    • 2015-04-10
    • 2013-01-04
    • 2018-11-22
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2017-05-25
    相关资源
    最近更新 更多