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 调用子例程的语句。