我如何自动将任何类型为 www.example.com 的链接重定向到 example.com。
我想对所有访问 varnish 实例的链接执行此操作(这样我就不必单独定义所有访问服务器的域的值)。
我尝试使用以下方法:
if(req.http.host ~ "^www\.(.+)$"){
set req.http.host = regsub(req.http.host, "^www\.", "");
}
它可以工作,但问题是它击中了正确的后端,但没有重定向。我从这里了解到:https://www.varnish-cache.org/vmod/redirect您可以重定向到一个 url,但我不确定如何从 varnish 获取“完整”url 以删除 www 并重定向。
任何帮助,将不胜感激!
多谢!
杰森
答案1
Varnish 没有本机机制来从 重定向vcl_recv()
。相反,您必须抛出一个错误才能vcl_recv()
在 中捕获vcl_error()
。这是因为vcl_recv()
无法访问响应对象。您可以阅读有关如何做到这一点。以下是我针对您的情况尝试做出的回答。
在vcl_recv()
:
if (req.http.host ~ "^www\.") {
error 750 regsub(req.http.host, "^www\.(.*)", "http://\1"); //Capture everything after the www. and place it after a http://
}
在vcl_error()
:
if (obj.status == 750) {
set obj.http.Location = obj.response;
set obj.status = 302;
return(deliver);
}
答案2
vcl4.0;
sub vcl_recv {
if (req.http.host ~ "^([-0-9a-zA-Z]+)\.([a-zA-Z]+)$") {
return (synth (750, ""));
}
}
sub vcl_synth {
if (resp.status == 750) {
set resp.status = 301;
set resp.http.Location = "http://www." + req.http.host + req.url;
return(deliver);
}
}
答案3
这是我针对 VCL 4.x 的解决方案。
首先检查它是否与“www.”开头的匹配,然后从开头使用正则表达式删除“www.”并设置新的位置
sub vcl_recv {
if (req.http.host ~ "^www\.") {
return (synth (750, ""));
}
}
sub vcl_synth {
if (resp.status == 750) {
set resp.status = 302;
set resp.http.Location = "http://" + regsuball(req.http.host, "^www\.", "") + req.url;
return(deliver);
}
}