Varnish:regsuball 是做什么的?

Tat*_*ana 1 caching varnish

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

Thi*_*ryn 5

句法

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

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

例子

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

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

想象一下将以下 cookie 传递给 Varnish:

Cookie: a=1; b=2; original-cookie-1=bla; c=3; original-cookie-2=test
Run Code Online (Sandbox Code Playgroud)

查找/替换后的结果将是:

Cookie: a=1; b=2; modified-cookie-1=bla; c=3; modified-cookie-2=test
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

varnishtest test.vtc
Run Code Online (Sandbox Code Playgroud)

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

docker run --rm  --name varnishtest  -v $(pwd)/test.vtc:/etc/varnish/test.vtc varnish:stable varnishtest /etc/varnish/test.vtc
Run Code Online (Sandbox Code Playgroud)