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来创建此类字符串。
访问控制列表(ACL)¶
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地址与ACL匹配,只需使用匹配运算符::
if (client.ip ~ local) {
return (pipe);
}
在Varnish 7.0之前的版本中,ACL始终会发出 VCL_acl 记录在VSL日志中,则必须通过指定 +log 旗帜::
acl local +log {
"localhost"; // myself
"192.0.2.0"/24; // and everyone on the local network
! "192.0.2.23"; // except for the dialin router
}
操作员¶
VCL中提供了以下运算符。请看下面的示例,嗯,示例。
- =
赋值操作符。
- ===
比较一下。
- ~
火柴。可以与正则表达式或ACL一起使用。
- 好了!
否定。
- &&
逻辑上的 and
- ||
逻辑上的 or
内置子例程¶
Varnish有相当多的内置子例程,每个事务在流经Varnish时都会调用这些子例程。这些内置子例程都命名为 vcl_*
并在中进行解释 VCL步骤 。
内置子例程中的处理以 return (<action>)
(见 VCL操作 )。
这个 内置VCL 还包含由内置子例程调用的自定义辅助子例程,也以 vcl_
。
自定义子例程¶
您可以编写自己的子例程,其名称不能以 vcl_
。
子例程通常用于对代码进行分组以提高易读性或可重用性:
sub pipe_if_local {
if (client.ip ~ local) {
return (pipe);
}
}
若要调用子例程,请使用 call
关键字后跟子例程的名称::
call pipe_if_local;
VCL中的自定义子例程不带参数,也不返回值。
return (<action>)
(见 VCL操作 ),如上例所示,从顶层内置子例程返回(请参见 VCL步骤 ),这可能通过多个步骤导致自定义子例程的调用。
return
在不执行任何操作的情况下,在 call
调用子例程的语句。