我有以下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位数字还是我在做傻/傻事?
答案 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