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

时间:2016-03-22 17:08:18

标签: redirect varnish http-accept-language

我在apache面前使用清漆4。我需要deutsh.de的请求来自带有首选语言es或ca的标题(除非它还有de或en)被重定向到spanish.es。 有人能为我提供适当的语法吗? 谢谢

2 个答案:

答案 0 :(得分:2)

所以我设法将用于启动清漆的文件放在一起:

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

......这似乎有用

答案 1 :(得分:0)

我用正则表达式稍微扩展了建议的解决方案,以保证我们不会在接受语言标头中配置德语或英语作为优先级更高的语言。
为了解释正则表达式,我认为最好记住这样一个Accept-Language标头的样子:Accept-Language: de-DE,en-US,es
为了考虑用户的偏爱,使用的正则表达式会搜索提供的语言,但同时要确保之前找不到其他提供的语言。
使用否定的前瞻性表达式"(^(?!de|en).)*"在某种程度上以隐式方式实现了后者,以确保 de en 都不会出现在“ es | ca | eu” 条目。

^            # line beginning
.*           # any character repeated any number of times, including 0
?!           # negative look-ahead assertion

此外,我还添加了一个检查:是否已经使用SSL来实现语言和一次重定向中的SSL切换。
使用return(synth(850, "Moved permanently"));,您可以在 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);
  }
}