【问题标题】:Varnish: what does regsuball do?清漆:regsuball 是做什么的?
【发布时间】:2021-09-27 17:32:00
【问题描述】:

我发现的关于 regsuball 的所有信息 - 这是来自文档的描述:https://book.varnish-software.com/3.0/VCL_Basics.html#vcl-functions。但我仍然不清楚 regsuball 函数内部发生了什么。传递的参数(str、regex、sub)如何使用?是否有沙箱可以在线测试 regsuball 功能?谢谢!

【问题讨论】:

    标签: caching varnish


    【解决方案1】:

    语法

    regsuball() 函数将对字符串执行正则表达式匹配,并将所有出现的地方替换为另一个模式。

    regsuball(string, regex, sub)
    
    • string 参数是您的输入。
    • regex 参数是您用来匹配您在输入字符串中查找的内容的正则表达式。
    • sub 参数是输入字符串将被替换的内容。

    示例

    以下示例将查找名为 original-cookie-123 的 cookie,其中数字后缀可以是任意数字。它用modified-cookie-123 代替:

    regsuball(req.http.Cookie, "original-cookie-([0-9+])", "modified-cookie-\1");
    

    想象一下使用以下 cookie 传递给 Varnish:

    Cookie: a=1; b=2; original-cookie-1=bla; c=3; original-cookie-2=test
    

    查找/替换后的结果是:

    Cookie: a=1; b=2; modified-cookie-1=bla; c=3; modified-cookie-2=test
    

    regsub() 匹配并替换模式的第一个匹配项,regsuball() 替换所有匹配项。

    沙盒

    如果您想在沙盒中测试regsuball(),最简单的方法是在测试用例上运行varnishtest。这是一个例子:

    varnishtest "Regsuball sandbox"
    
    varnish v1 -vcl+backend { 
        vcl 4.1;
    
        backend default none;
    
        sub vcl_recv {
            if (req.http.Cookie) {
                set req.http.Cookie = regsuball(req.http.Cookie, "original-cookie-([0-9+])", "modified-cookie-\1");
                return (synth(200, req.http.Cookie));
            } 
            return (synth(400, "No cookie found"));
        }
    
        sub vcl_synth {
            set resp.http.Content-Type = "text/plain; charset=utf-8";
            set resp.body = req.http.Cookie;
            return (deliver);
        }
    
    } -start
    
    client c1 {
        txreq -hdr "Cookie: a=1; b=2; original-cookie-1=bla; c=3; original-cookie-2=test"
        rxresp
        expect resp.body == "a=1; b=2; modified-cookie-1=bla; c=3; modified-cookie-2=test"
    } -run
    

    此测试用例使用前面提到的确切示例。在查找和替换之后,这个测试用例中的 VCL 代码将综合返回结果值作为输出。无需后端服务器,所有输出均由 VCL 代码生成。

    运行测试用例,假设它存储在test.vtc,可以使用以下命令完成:

    varnishtest test.vtc
    

    您还可以在 Docker 容器中隔离运行此测试用例。只需运行以下命令来引导 Varnish Docker 容器并运行测试:

    docker run --rm  --name varnishtest  -v $(pwd)/test.vtc:/etc/varnish/test.vtc varnish:stable varnishtest /etc/varnish/test.vtc
    

    【讨论】:

      猜你喜欢
      • 2016-05-28
      • 2019-02-10
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2022-01-09
      • 2016-12-03
      • 2014-04-25
      相关资源
      最近更新 更多