我如何去自动将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); } }