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

时间:2018-01-26 10:40:18

标签: nginx nginx-location

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

Server-A

当我在官方文件here中阅读时,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; } 被视为邪恶

我的方法是否有更好的解决方案,不被视为 evil

1 个答案:

答案 0 :(得分:2)

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

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

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