HAProxy acl规则

时间:2016-12-01 00:57:24

标签: apache load-balancing haproxy

我有以下acl规则来检查我的url_param值的范围。

acl small       urlp_val(uid) le 311111111111000000
acl medium       urlp_val(uid) 311111111111000001:311111111111001000
acl large       urlp_val(uid) ge 311111111111001001

这个数字是64位整数。这种比较似乎不起作用。它始终只重定向到一个实例。如果我将数字减少到1到100的范围,那么效果很好。它不支持64位数字还是我在做傻/傻事?

2 个答案:

答案 0 :(得分:0)

documentation总是使用“int”和“integer”来讨论这种类型。如果您查看源代码,您会看到smp_fetch_url_param_val使用的strl2ic返回int,而不是long

所以不,你不能用urlp_val提取64位值。

答案 1 :(得分:0)

我也有类似的任务。我通过从大量数字中删除最后6个字符并仅比较第一部分来解决了这个问题。

# my case: if some_id >= 9089000000 use backend_2

acl is_number_long urlp_reg('some_id') '^\d{7,}$'
acl is_first_part_great urlp('some_id'),regsub('\d{6}$','') -m int gt 9088

use_backend backend_2 if is_number_long is_first_part_great

default_backend backend_1

您可以尝试以下操作:

# some_id = 311111111111000000 -> first_part = 311111111, last_part = 111000000

acl is_number_long urlp_reg('some_id') '^\d{10,}$'

acl is_first_part_gt urlp('some_id'),regsub('\d{9}$','') -m int gt 311111111
acl is_first_part_eq urlp('some_id'),regsub('\d{9}$','') -m int eq 311111111

acl is_last_part_gt urlp('some_id'),regsub('^.*(\d{9})$','\1') -m int gt 111000000
acl is_last_part_lt urlp('some_id'),regsub('^.*(\d{9})$','\1') -m int lt 111001001

use_backend backend_3 if is_number_long is_first_part_gt                                  # large
use_backend backend_3 if is_number_long is_first_part_eq !is_last_part_lt                 # large

use_backend backend_2 if is_number_long is_first_part_eq is_last_part_gt is_last_part_lt  # medium

default_backend backend_1                                                                 # small