前面第一部分介绍了aFlex一些基本概念,包括aFlex的3个主要组成部分、以及第一个组成部分events的主要类别的介绍,还记得我们前面那个简单的示意图吗?
当发生某个事件的时候{
{ [如果满足某个条件]} {
执行某个命令}
}
Events可以表示当发生某个事件的时候,Operators和一些特定的command(这些特定的command一般是用来获取报文里特定位置的内容,比如IP地址,TCP端口号,http内容等)连接在一起表示如果满足某个条件,而command(这里的command和前面提到的特定command有所区别,主要是用来进行一些特定的动作)则表示执行某个命令。
第二部分我们会介绍aFlex的第二个组成部分Operators
在开始之前我们先看一个aFlex脚本的经典例子:
when HTTP_REQUEST {
if { [HTTP::uri] ends_with ".gif" } {
pool gif_pool
} elseif { [HTTP::uri] ends_with ".jpg" } {
pool jpg_pool }
}
在上面这个典型的例子中,红色部分的when HTTP_REQUEST{}即是events,表达的意思为当AX的VIP上收到一个完整的http request的时候触发该aFlex脚本;两行蓝色的if { [HTTP::uri] ends_with ".gif" }和elseif { [HTTP::uri] ends_with ".jpg" }分别表示当http链接的URI部分以”.gif”结尾以及当http链接的URI部分以”.jpg结尾”这两种情况的时候满足该条条件;棕色的两行{pool gif_pool}
和{pool jpg_pool }分别表示满足各自的条件以后执行的command(选择某个对应的服务器组)
这里需要普及几个常识:
A、:: 表示从属关系,例如HTTP::uri,表示uri是从属于HTTP类
B、“” 双引号里的内容表示里面为字符串变量,不带双引号的变量为数值变量
C、[] 表示里面为一个command ,[command]表示这个command在当前事件中的变量值 。对于www.sina.com.cn/bbs 这个链接来说,”HTTP::uri:[HTTP::uri]”这个字符串,显示出来的内容为”HTTP::uri :/bbs”
1、Operators
Operators其实很简单,说穿了就是一些逻辑关系符号,和一些特定的command一起使用,表达满足某个或者某些条件。
第一类:关系符号
1、Contains 包含
使用方式: (string1) contains (string2)
例如:
if { [TCP::payload] contains "XYZ" } {
pool xyz_servers
}
假如TCP数据内容中包含字符串XYZ时,选择服务器组xyz_servers
2、ends_with 以特定字符串结束
使用方式: (string1) ends_with (string2)
例如:
if { [HTTP::uri] ends_with ".gif" } {
pool gif_pool
}
假如http链接中的URI是以.gif结尾时,选择服务器组gif_pool
3、equals 等于
使用方式: string1 ends_with strig2
例如:
when CLIENT_ACCEPTED{
if { [IP::addr [IP::client_addr] equals 192.168.0.0/16] } {
pool 192.168_pool
}
}
假如客户端IP地址等于192.168.0.0/16网段中的IP,则选择服务器组192.168_pool
4、matches 匹配(只限于字符串变量)
使用方式 : (string1) matches (string2)
例如:
if { [HTTP::uri] matches {*\\aol\\[a-z].html} } {
pool aol_pool
}
假如http链接的URI匹配字符串*\\aol\\[a-z].html,则选择服务器组aol_pool
5、matches_regex 匹配表达式,也可以匹配字符串变量,和matches类似
6、starts_with 以特定字符串开始
使用方式:(string1) starts_with (string2)
例如:
if { [HTTP::uri] starts_with "/news" } {
pool news_pool
}
假如http链接的URI是以/news开始的,则选择服务器组news_pool
第二类:逻辑符号
1、and 同时满足两个条件
使用方式:<value1> and <value2>
例如:
if { ([HTTP::uri] starts_with "/abc") and ([HTTP::host] equals "www.company.com") } {
pool pool1
}
假如http链接的URI是以/abc开头,并且http链接的host等于www.company.com,则选择服务器组pool1
2、not 非某个条件
使用方式:not <value2>
例如:
if { not ([HTTP::uri] starts_with "/abc") } {
pool pool1
}
假如http链接的URI不是以/abc开头的,则选择服务器组pool1
3、or 或者,两者满足其一
使用方式:<value1> or <value2>
例如:
if { ([HTTP::uri] starts_with "/abc") or ([HTTP::uri] starts_with
"/cde") } {
pool pool1
}
假如http链接的URI是以/abc开头或者以/cde开头的,则选择服务器组pool1
待续
t.d.