配置和使用变量
您必须首先创建一个变量,然后赋值或指定必须对该变量执行的操作。执行这些操作后,您可以将分配用作策略操作。
注意:一旦配置,变量的设置不能被修改或重置。如果需要更改变量,则必须删除该变量以及对该变量的所有引用(表达式和赋值)。然后可以用新的设置重新添加变量,并且可以重新添加引用(表达式和赋值)。
通过命令行界面配置变量
- 创建一个变量。
add ns变量 -type [-scope global] [- ifffull (undef | lru)] [-ifValueTooBig (undef | truncate)] [-ifNoValue (undef | init)] [-init ] [-expires ] [-comment ]
请注意:命令参数说明请参考手册中的“man add ns variable”。
示例1:创建一个名为“my_counter”的ullong变量,并将其初始化为1。
添加ns变量my_counter -type ulong -init 1
例2:创建名为“user_privilege_map”的映射。该映射将包含最大长度为15个字符的键和最大长度为10个字符的文本值,最多包含10000个条目。
添加ns变量user_privilege_map -type map(text(15),text(10),10000)
请注意:如果map包含10000个未过期的表项,则对新键的分配重用最近最少使用的表项之一。默认情况下,试图为不存在的键获取值的表达式将初始化一个空文本值。
赋值或指定要对变量执行的操作。这是通过创建一个赋值来实现的。
添加ns赋值 -variable [-set | -add | -sub | -append | -clear] [-comment ]
注意:变量是通过变量选择器($)来引用的。因此,variable1美元用于引用文本或字符串变量。同样的,如上所述美元的操作(键表达式)用于引用映射变量。
例1:定义一个名为“inc_my_counter”的赋值,它会自动给“my_counter”变量加1。
添加ns赋值inc_my_counter -变量$my_counter -add 1
示例2:定义一个名为“set_user_privilege”的赋值,它向“user_privilege_map”变量添加一个客户端IP地址条目,该条目的值由“get_user_privilege”HTTP调出返回。
增加ns分配set_user_privilege -variable $user_privilege_map[client.ip.src]。设置sys.http.callout(get_user_privilege)
请注意:如果该键的表项已经存在,该值将被替换。否则,将为键和值添加一个新条目。根据前面对user_privilege_map的声明,如果映射已经有10000个条目,那么将为新的键和值重用最近最少使用的条目之一。
在策略中调用变量赋值。
有两个函数可以对map变量进行操作。
美元name.valueExists(键表达式)。如果映射中有键表达式选择的值,则返回true。否则返回false。如果映射条目存在,该函数将更新过期和LRU信息,但如果该值不存在,则不会创建新的映射条目。
name.valueCount美元。返回变量当前持有的值的数目。这是映射中的条目数。对于单例变量,如果该变量未初始化,则为0,否则为1。
例子:用压缩策略调用名为“set_user_privilege”的赋值。
添加cmp策略set_user_privilege_pol -rule $user_privilege_map.valueExists(client.ip.src.typecast_text_t)。not -resAction set_user_privilege
在响应端插入HTTP报头的用例
下面的示例显示了一个单例变量的示例。
添加一个文本类型的单例变量。这个变量最多可以保存100字节的数据。
添加ns变量http_req_data -type text(100) -scope transaction
添加一个赋值操作,该操作将用于将HTTP请求数据存储到变量中。
$http_req_data -set http.req.body(100)
添加一个重写操作来插入HTTP头,其值将从变量中获取。
添加重写动作act_ins_header insert_http_header user_name $http_req_data.after_str("user_name").before_str("password")
添加一个重写策略,该策略将在请求时间内评估,并采取分配操作来存储数据。当我们达到这个策略时,我们将采取赋值操作并将数据存储到ns变量(http_req_data)中
添加重写策略pol_set_variable true set_http_req_data绑定重写全局pol_set_variable 10 type req_dEFAULT
添加一个重写策略,它将评估响应时间,并在响应中添加HTTP头。
添加重写策略pol_ins_header true act_ins_header绑定重写全局pol_ins_header 10 -type res_dEFAULT
赋值操作
在Citrix ADC设备中,当策略规则的计算结果为true时,将触发绑定到策略的分配操作。该操作更新变量中的值,该值可用于后续的策略规则评估。通过这种方式,可以更新相同的变量,并将其用于相同特性中的后续策略评估。以前,当关联分配操作的策略评估为true时,设备只有在评估了特性中的所有策略后才执行分配操作。因此,分配操作设置的变量值不能用于该特性中后续的策略规则评估。
使用控制Citrix ADC设备上客户端访问列表的用例可以更好地理解此功能。访问决策由单独的web服务与请求一起提供/客户端访问吗?<客户端ip地址>
它返回一个在body中带有“BLOCK”或“ALLOW”的响应。HTTP调出被配置为包含与传入请求相关联的客户机的IP地址。当Citrix ADC设备接收到来自客户机的请求时,该设备生成调出请求并将其发送到调出服务器,该服务器托管一个列入黑名单的IP地址数据库和一个HTTP调出代理,该代理检查客户机的IP地址是否在数据库中列出。HTTP调出代理接收调出请求,检查是否列出了客户端的IP地址,并发送响应。响应是状态码200,302,正文中有“BLOCK”或“ALLOW”。根据状态码,设备执行策略评估。如果策略评估为真,则立即触发分配操作,并将值设置为变量。设备使用并设置该变量值,以便在同一模块中进行后续策略评估。
配置分配操作的用例
按照以下步骤配置分配操作并为后续策略使用变量:
访问决策是由一个单独的web服务提供的,请求返回的响应在请求体中带有BLOCK或ALLOW。
GET / url-service > / url-allowed吗?< URL路径>
设置一个映射变量来保存url的访问决策。
添加变量url_list_map -type 'map(text(1000),text(10),10000)'
设置HTTP调出以向web服务发送访问请求。
添加策略httpCallout url_list_callout -vserver url_vs -returnType TEXT -urlStemExpr '"/url-allowed?"+ HTTP.REQ.URL。` ` HTTP.RES.BODY(10) ` `
设置一个分配操作来调用调出以获得访问决策,并将其分配给URL的映射条目。
$client_access_map[CLIENT.IP.SRC. js]' -set SYS.HTTP_CALLOUT(client_access_callout)
设置一个响应器动作,以便在URL请求被阻止时发送403响应。
添加responder action url_list_block_act respondwith '"HTTP/1.1 403被禁止\\r\\n\\r\\n"'
设置一个响应器策略来设置URL的映射条目(如果还没有设置)。使用即时操作增强,在评估此策略时设置映射条目值。在增强之前,直到评估了所有响应器策略(决策由单独的web服务提供)之后才进行分配。
$url_list_map.VALUEEXISTS(HTTP.REQ.URL.PATH)' url_list_assn . path
设置一个响应器策略来阻止对URL的访问,如果它的映射条目值是block。通过立即动作增强,上述策略设置的映射项可以在此策略中使用。在增强之前,此时地图条目仍然是未设置的。
添加响应策略client_access_block_pol '$client_access_map。client_access_block_act . txt == "BLOCK"
将响应器策略绑定到虚拟服务器。请注意:我们不能全局绑定策略,因为我们不想在单独的虚拟服务器上为HTTP调出执行它们。
bind lb vserver vs -policyName client_access_assn_pol -priority 10 -gotoPriorityExpression NEXT -type REQUEST
bind lb vserver vs -policyName client_access_block_pol -priority 20 -gotoPriorityExpression END -type REQUEST
通过使用配置实用程序来配置变量
- 导航到AppExpert > NS变量,以创建一个变量。
- 导航到AppExpert b> nsassignments,为变量赋值。
- 导航到您想要将分配配置为操作的适当特性区域。