【问题标题】:Varnish redirect based on browser language settings清漆重定向基于浏览器语言设置
【发布时间】:2016-07-09 17:19:13
【问题描述】:

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

【问题讨论】:

    标签: redirect varnish http-accept-language


    【解决方案1】:

    所以我设法在用于启动 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);
    }
    }
    

    ...这似乎有效

    【讨论】:

    • vcl_recv 中的 if 语句当前包含两个 OR 语句之间的 AND,没有任何括号。这会导致奇怪的行为。最好只使用if(req.http.Accept-Language != "de" && req.http.Accept-Language~="en"){ } 您可以设置一个变量,该变量可用于在合成子 vcl_recv {` if(req.http.Accept-Language != "de" && req.http.Accept-Language ~="en"){ 设置 req.http.redirectTo = "es"; return (synth(302,"Moved Temporarily"); }} sub vcl_synth{ if(req.http.redirectTo == "es"){ set resp.http.Location ="spanish.es"; return (deliver) }} `
    【解决方案2】:

    我用一些正则表达式稍微扩展了建议的解决方案,以保证我们没有在接受语言标头中配置德语或英语作为更高优先级的语言。
    为了解释正则表达式,我认为最好记住这样的 Accept-Language 标头可能看起来像:Accept-Language: de-DE,en-US,es
    为了考虑用户的偏好,使用的正则表达式搜索提供的语言,但同时确保之前不会找到任何其他提供的语言。
    后者是通过否定前瞻表达式"(^(?!de|en).)*" 来实现的,以确保 deen 都不会出现在 "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);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-11
      • 1970-01-01
      • 2021-09-28
      • 2013-05-06
      • 2018-02-10
      • 1970-01-01
      • 2013-03-13
      • 2018-07-06
      • 1970-01-01
      相关资源
      最近更新 更多