proxy_pass 基于 headers 而不使用 if 条件
proxy_pass based on headers without using if condition
我正在寻找一种方法来重新路由所有在 HTTP header Account-ID
中设置了 account-id 和最后两位数(十位数)的请求00
到 05
(仅触及总流量的 5%)。此外,如果请求已设置 HTTP header Server-A
,则无论设置如何 account-id,该请求都应转发到该服务器。否则,默认情况下,所有流量都应由 server-b 处理。我当前的 location-rule 看起来像这样:
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;
}
正如我在官方文档here中所读,if
被认为是邪恶。
我的方法是否有更好的解决方案邪恶?
您实际上可以链接 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
header 进行检查。然后,如果 none 个变体通过了检查,default
从 $server_a_check
的结果中获取其值,该结果查找 Server-A
header 而没有数据值,因为问题没有说明可接受的值是什么。
我正在寻找一种方法来重新路由所有在 HTTP header Account-ID
中设置了 account-id 和最后两位数(十位数)的请求00
到 05
(仅触及总流量的 5%)。此外,如果请求已设置 HTTP header Server-A
,则无论设置如何 account-id,该请求都应转发到该服务器。否则,默认情况下,所有流量都应由 server-b 处理。我当前的 location-rule 看起来像这样:
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;
}
正如我在官方文档here中所读,if
被认为是邪恶。
我的方法是否有更好的解决方案邪恶?
您实际上可以链接 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
header 进行检查。然后,如果 none 个变体通过了检查,default
从 $server_a_check
的结果中获取其值,该结果查找 Server-A
header 而没有数据值,因为问题没有说明可接受的值是什么。