我正在尝试设置清漆来处理我的默认网址,即 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
运行它