如何从 www 重定向到非 www varnish

如何从 www 重定向到非 www varnish

我如何自动将任何类型为 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);
    }
}

相关内容