判断条件至少包含一个变量或常量,通过对一个或多个变量的值进行判断或比较,取出结果为TRUE或FALSE,来决定执行分支,判断条件包括如下几种情况:
(a) 判断条件中只包含一个变量;
(b) 判断条件中包含了两个变量;
(c) 文件或目录属性的判断;
判断比较操作主要包括:
(a) 变量1 == 变量2,判断是否相等,两个变量值内容相同为TRUE,否则为FALSE
(b) 变量1 != 变量2,判断不相等,两个变量值内容不相同为TRUE,否则为FALSE
(c) 变量名,判断变量值,变量定义了、且变量值不为NULL、且变量值不为0,则为TRUE,否则为FALSE
(d) !变量名,变量值取反判断,变量未定义,或变量值为NULL、或变量值为0,则为TRUE,否则为FALSE
(e) 变量1 ^~ 变量2,变量1中的起始部分是以变量2开头,则为TRUE,否则为FALSE
(f) 变量1 ~ 变量2,在变量1中查找变量2中的区分大小写正则表达式,如果匹配则为TRUE,否则为FALSE
(g) 变量1 ~* 变量2,在变量1中查找变量2中的不区分大小写正则表达式,如果匹配则为TRUE,否则为FALSE
(h) -f 变量,取变量值字符串对应的文件存在,则为TRUE,否则为FALSE
(i) !-f 变量,取变量值字符串对应的文件不存在,则为TRUE,否则为FALSE
(j) -d 变量,取变量值字符串对应的目录存在,则为TRUE,否则为FALSE
(k) !-d 变量,取变量值字符串对应的目录存在,则为TRUE,否则为FALSE
(l) -e 变量,取变量值字符串对应的文件、目录、链接文件存在,则为TRUE,否则为FALSE
(m) !-e 变量,取变量值字符串对应的文件、目录、链接文件不存在,则为TRUE,否则为FALSE
(n) -x 变量,取变量值字符串对应的文件存在并且可执行,则为TRUE,否则为FALSE
(o) !-x 变量,取变量值字符串对应的文件不存在或不可执行,则为TRUE,否则为FALSE
5.4.2 赋值语句
赋值语句主要由set语句构成,eJet系统中局部变量的创建和赋值是通过set语句来完成的。其语法如下:
set $变量名 value;
5.4.3 返回语句
返回语句也即是return语句,将script闭合标签内嵌入的Scirpt脚本代码执行运算后的结果,或Key-Value对中Value内嵌的脚本程序,解释执行后的结果返回给Key变量,基本语法为:
return $变量名;return 常量;
其使用形态如下:
cache file =
;
5.4.4 响应语句
响应语句也就是reply语句,执行该语句后,eJet系统将终止当前HTTP请求HTTPMsg的任何处理,直接返回HTTP响应给客户端,其语法如下:
reply 状态码 [ URL或响应消息体 ];
如果返回的状态码是 444,则直接断开 TCP 连接,不发送任何内容给客户端。
调用Reply指令时,可以使用的状态码有:204,400,402-406,408,410, 411, 413, 416 与 500-504。如果不带状态码直接返回 URL 则被视为 302。其使用形态如下:
if ($http_user_agent ~ curl) { reply 200 'COMMAND USERn'; } if ($http_user_agent ~ Mozilla) { reply 302 http://www.baidu.com?$args; } reply 404;
eJet系统在解释器解释执行Script代码时,先执行Listen下的script脚本、再执行Host下的script脚本,最后再执行Location下的script脚本。在执行下一个脚本之前,先判断刚刚执行的script脚本是否已经Reply了或者已经关闭当前HTTPMsg了。如果Reply了或关闭当前消息了,则直接返回,无需继续解析并执行后续的script脚本程序。
5.4.5 rewrite语句
eJet系统中的URL重写是通过Script脚本来实现的,分别借鉴了Apache和Nginx的成功经验。
rewrite语句实现URL重写功能,当客户HTTP请求到达Web Server并创建HTTPMsg后,分别依次执行Listen、Host、Location下的script脚本程序,rewrite语句位于这些script脚本程序之中,rewrite语句会改变请求DocURL,一旦改变请求DocURL,在依次执行完这些script脚本程序之后,继续基于新的DocURL去匹配新的Host、Location,并继续依次执行该Host、Location下的script脚本程序,如此循环,是否继续循环执行,取决于rewrite的flag标记。
rewrite基本语法如下:
rewrite regex replacement [flag];
执行该语句时是用regex的正则表达式去匹配DocURI,并将匹配到的DocURI替换成新的DocURI(replacement),如果有多个rewrite语句,则用新的DocURI,继续执行下一条语句。