VCL语法
VCL从C语言继承了很多东西,它读起来非常像C或者Perl。
代码块是使用大括号分割,语句结束使用分号,注释可以根据自己的喜好来写为C,C ++或Perl的注释。
需要注意的是VCL不包含任何循环或跳转语句。
本节会大概讲述语法中的重要内容。如果想查看VCL的完整文档,可以查看VCL。
字符串
最基本的字符串形式是使用双引号包起来,例如" ... "
,同时不允许跨行。
反斜杠不是特殊符号,例如regsub中你不需要对反斜杠进行转义。
regsub("barf", "(b)(a)(r)(f)", "\4\3\2p") -> "frap"
比较长的字符串可以使用{"..."}
,它可以包含任何字符,包括双引号、换行符以及其他一些控制字符,除了NUL(0x00)。如果你真的想要在字符串中使用NUL字符,VMOD可以帮助你实现该功能。
权限控制列表 Access control lists (ACLs)
ACL声明创建和初始化一个权限控制列表,通常用来匹配客户端地址:
acl local {
"localhost"; // myself
"192.0.2.0"/24; // and everyone on the local network
! "192.0.2.23"; // except for the dialin router
}
如果您的ACL指定了一个varnish无法解析的地址,那么它将与它比较的任何地址来进行匹配。因此,如果它前面有一个否定标记,那么他会拒绝任何和它相关的地址,这些可能是你不能预料的。如果该条目被括号括起来的话,这个将会被简单的忽略。
匹配ip地址的时候,会简单的使用匹配运算符:
if (client.ip ~ local) {
return (pipe);
}
运算符 Operators
下面是一些可以在VCL中使用的运算符:
=
赋值运算符==
比较运算符~
匹配。可以使用正则表达式或者ACLs。!
否定运算符&&
逻辑与||
逻辑或
子程序 Subroutines
子程序可以增加代码的可读性和可重用性:
sub pipe_if_local {
if (client.ip ~ local) {
return (pipe);
}
}
在子程序中不能引入参数,也不能有返回值。
调用子程序,可以使用关键词call
后面跟上子程序的名字:
call pipe_if_local;
varnish有一些内建的子程序,当请求通过varnish的时候会调用这些内建的子程序。这些内建的子程序都被命名为vcl.*
,你自己编写的子程序不能使用 vcl 开头。