如何从wwwredirect到非www清漆

我如何去自动将typeswww.example.com的任何链接redirect到example.com。

我想这样做的所有链接,点击清实例(所以我不必单独定义所有域的命中服务器的值)。

我尝试使用以下内容:

if(req.http.host ~ "^www\.(.+)$"){ set req.http.host = regsub(req.http.host, "^www\.", ""); } 

它的工作原理,但问题是它是右后端,但它不是redirect。 我从这里明白: https : //www.varnish-cache.org/vmod/redirect你可以redirect到一个url,但我不知道如何从清漆得到“完整”的url去除www和redirect。

任何帮助,将不胜感激!

非常感谢!

贾森

Varnish没有从vcl_recv()redirect的本机机制。 相反,您必须从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); } 

vcl 4.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); } } 

这是我的VCL 4.x解决scheme。

首先检查它匹配'开始'“www。” 然后将“www”正则expression出来。 从一开始就设置新的位置

 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); } }