VCL Syntax
varnish从C继承了很多,同时它读起来像简单的C或者是Perl。
块由大括号分隔,语句用分号结束,注释可以根据自己的喜好来写为C,C ++或Perl的注释。
注意VCL不包含任何循环和跳转语句。
本节提供大致最重要部分的语法。完整的VCL语法文档请查看https://www.varnish-cache.org/docs/4.0/reference/vcl.html#reference-vcl
Strings
基本的字符是被双引号引起来,像"...",同时不可以跨行。 反斜杠不是特别的,例如regsub你不需要对\进行转义:
regsub("barf", "(b)(a)(r)(f)", "\4\3\2p") -> "frap"
长字符应该被{"..."}。它们可以包含任何字符包括"、跨行、除了NUL(0×00)字符等控制字符。如果你真的想字符串中使用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地址,使用VCL,简单的使用匹配操作:
if (client.ip ~ local) {
return (pipe);
}
Operators
下面这些操作时可以在VCL中使用的,查看例子来进一步了解这些操作。
=
Assignment operator.赋值操作
==
Comparison.比较
~
Match. Can either be used with regular expressions or ACLs.匹配操作,可以使用正则或者ACLs
!
Negation.非
&&
Logical and 逻辑与
||
Logical or 逻辑或
Subroutines
子程序可以让一段代码易读的同时可以重用代码。
sub pipe_if_local {
if (client.ip ~ local) {
return (pipe);
}
}
在VCL的子程序,不能引入参数,也不会返回值
调用子程序,使用call关键字,后面跟上被调用的子程序的名字:
call pipe_if_local;
varnish已经有了一些内建的子程序,当请求流通过varnish时将会调用这些内建的子程序。这些所有的内建子程序被命名成vcl.* 你自己编写的子程序不能以vcl开始。
来源:oschina
链接:https://my.oschina.net/u/1762367/blog/466986