前面第一部分介绍了aFlex一些基本概念,包括aFlex3个主要组成部分、以及第一个组成部分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,表达的意思为当AXVIP上收到一个完整的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.