Redirect 基于浏览器语言设置的清漆重定向

Redirect 基于浏览器语言设置的清漆重定向,redirect,varnish,http-accept-language,Redirect,Varnish,Http Accept Language,我在apache前面使用varnish 4。我需要将来自首选语言es或ca(除非它也有de或en)的标题对deutsh.de的请求重定向到spanish.es。 有人能给我提供合适的语法吗? 谢谢所以我设法在用于启动varnish的文件中添加了一些内容: sub vcl_recv { if((req.http.Accept-Language !~ "de" || req.http.Accept-Language !~ "en") && (req.http.Acce

我在apache前面使用varnish 4。我需要将来自首选语言es或ca(除非它也有de或en)的标题对deutsh.de的请求重定向到spanish.es。 有人能给我提供合适的语法吗?
谢谢

所以我设法在用于启动varnish的文件中添加了一些内容:

sub vcl_recv {
       if((req.http.Accept-Language !~ "de" || req.http.Accept-Language !~ "en")  && (req.http.Accept-Language ~ "es" ||  req.http.Accept-Language ~ "ca" ||  req.http.Accept-Language ~ "eu"))
         {
        return(synth(301,"Moved Permanently"));
         }
}

sub vcl_synth {
      if(req.http.Accept-Language ~ "es" ||  req.http.Accept-Language ~ "ca" ||  req.http.Accept-Language ~ "eu")
         {
        set resp.http.Location = "http://spanish.es";
        return (deliver);
}
}

…这似乎是可行的

我用一些正则表达式略微扩展了建议的解决方案,以保证我们不会在accept language标头中配置德语或英语作为更高优先级的语言。
为了解释正则表达式,我认为最好记住这样一个
Accept Language
头可能是什么样子:
Accept Language:de de de,en US,es

为了考虑用户的偏好,所使用的正则表达式搜索所提供的语言,但同时确保不会找到其他提供的语言。
后者是通过一个否定的前瞻表达式
“(^(?!de|en)。*”
实现的,以确保de和en都不会出现在“es|ca|eu”条目之前

此外,我还添加了一个检查,检查是否已使用SSL在一个重定向中实现语言和SSL切换。
使用
返回(synth(850,“永久移动”)在vcl_synth中保存一个if子句,这将大大减少配置,尤其是当您必须执行许多基于语言的重定向时

sub vcl_recv {
 if (req.http.X-Forwarded-Proto !~ "(?i)https" && req.http.Accept-Language ~ "^((?!de|en).)*(es|ca|eu)" {
    set req.http.x-redir = "https://spanish.es/"  + req.url;
    return(synth(850, "Moved permanently"));
  }
}
sub vcl_synth {
  if (resp.status == 850) {
      set resp.http.Location = req.http.x-redir;
      set resp.status = 301;
      return (deliver);
  }
}

vcl_recv中的if语句当前包含AND介于2和OR之间的语句,不带任何括号。这会导致奇怪的行为。最好只使用
if(req.http.Accept-Language!=“de”&&req.http.Accept-Language~=“en”){
您可以设置一个变量,用于定义synth子vcl_recv{`if(req.http.Accept-Language!=“de”&&req.http.Accept-Language~=“en”){set req.http.redirectTo=“es”;return(synth(302,“暂时移动”);}}}子vcl_synth{if(req.http.redirectTo==“es”){set resp.http.Location=”“;return(deliver)}`
sub vcl_recv {
 if (req.http.X-Forwarded-Proto !~ "(?i)https" && req.http.Accept-Language ~ "^((?!de|en).)*(es|ca|eu)" {
    set req.http.x-redir = "https://spanish.es/"  + req.url;
    return(synth(850, "Moved permanently"));
  }
}
sub vcl_synth {
  if (resp.status == 850) {
      set resp.http.Location = req.http.x-redir;
      set resp.status = 301;
      return (deliver);
  }
}