【问题标题】:proxy_pass based on headers without using if conditionproxy_pass 基于标头而不使用 if 条件
【发布时间】:2018-07-05 16:45:23
【问题描述】:

我正在寻找一种方法来重新路由在 HTTP 标头 Account-ID 中设置了帐户 ID 的所有请求,最后两位数(十位数)0005(触摸仅占总流量的 5%)。此外,如果请求设置了 HTTP 标头 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;
}

正如我在官方文档中看到的hereif 被认为是邪恶的

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

【问题讨论】:

    标签: nginx nginx-location


    【解决方案1】:

    您实际上可以链接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;
        }
    }
    

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

    【讨论】:

    • 非常感谢,会尝试并尽快接受。
    • 我接受答案,尽管如果我输入 https://server-a 而不是 http://server-a... 会得到“502 Bad Gateway”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 2020-12-09
    • 1970-01-01
    • 2017-08-20
    • 2014-11-28
    • 1970-01-01
    • 2019-05-31
    相关资源
    最近更新 更多