清漆尾部斜杠重写



我正在尝试设置清漆来处理我的默认网址,即 example.url.co.uk。

如果它命中 example.url.co.uk 或 example.url.co.uk/我希望它重定向或重写到tomcat应用程序中将其发送到登录页面 example.url.co.uk/site。

sub vcl_recv {
if ((req.url ~ "") || (req.url ~"^/")) {
       set req.http.location = "https://example.url.co.uk/site" + req.url;
       return (synth(750, "Found"));
     }
}

sub vcl_synth {
    if (resp.status == 301) {
        set resp.http.Location = req.http.x-redir;
        return (deliver);
    }
    if (resp.status == 750) {
        set resp.http.Location = req.http.location;
        set resp.status = 302;
        return (deliver);
    }
}

但是,当我使用我的尝试时,我会得到 example.url.co.uk/site/site/site/site......

所以我显然陷入了一个循环,我已经为此苦苦挣扎了一个星期,试图找到正确的解决方案!我敢肯定,请把我从我自己的愚蠢中拯救出来!

问题是req.url ~ ""匹配所有的东西。 因为它用作正则表达式。 你的req.url ~ "^/"也太开放了。

将其更改为:

if (req.url == "" || req.url ~"^/$") {

应该修复它,验证它是空的还是自己/的。

这是一个简单的清漆测试来验证行为:

varnishtest "Test Redirect"
server s1 {
    rxreq
    txresp
    rxreq
    txresp
} -start
varnish v1 -vcl+backend { 

sub vcl_recv {
if (req.url == "" || req.url ~"^/$") {
       set req.http.location = "https://example.url.co.uk/site" + req.url;
       return (synth(750, "Found"));
     }
}

sub vcl_synth {
    if (resp.status == 301) {
        set resp.http.Location = req.http.x-redir;
        return (deliver);
    }
    if (resp.status == 750) {
        set resp.http.Location = req.http.location;
        set resp.status = 302;
        return (deliver);
    }
}

} -start
client c1 {
    txreq -url "/" 
    rxresp
    expect resp.status == 302
} -run

client c1 {
    txreq -url "/site" 
    rxresp
    expect resp.status == 200
} -run

您可以使用varnishtest test.vtc运行它

最新更新