proxy_pass 基于标头而不使用 if 条件

use*_*453 6 nginx nginx-location

我正在寻找一种方法,将所有在 HTTP 标头中设置了Account-ID最后两位数字(十位数字)的account-id 的请求重新00路由到05(仅触及总流量的 5%)。此外,如果请求设置了 HTTP header Server-A,则无论设置的 account-id 是什么,该请求都应该转发到该服务器。否则,默认情况下,所有流量都应由 server-b 处理。我当前的位置规则如下所示:

location /rest/accounts/ {
  if ( $http_account_id ~ '([\d]{8})(0[0-4])') {
    proxy_pass http://server-a.company.com;
  }

  if ( $http_server_a = true) {
    proxy_pass http://server-a.company.com;
  }

  proxy_pass http://server-b.company.com;
}
Run Code Online (Sandbox Code Playgroud)

正如我在官方文档中看到的,这里if被认为是邪恶的

对于我的方法是否有更好的解决方案,而不被认为是邪恶的

Sha*_* C. 6

实际上,您可以链接map指令 a ,这会使其更清晰。例如:

map $http_server_a $server_a_check {
    default                 "http://server-b.company.com";
    ""                      "http://server-a.company.com";
}

map $http_account $account_check{
    default                 $server_a_check;
    "~([\d]{8})(0[0-4])"    "http://server-a.company.com";
}

server {
    ....
    location / {
        proxy_pass          $account_check;
    }
}
Run Code Online (Sandbox Code Playgroud)

proxy_pass获取它的值也是如此$account_check,通过正则表达式检查对Account标头进行检查。然后,如果没有一个变体通过检查,default则从结果中获取其值,$server_a_check该结果会查找Server-A没有该值数据的标头,因为问题没有说明可接受的值是什么。