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