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 开头。

results matching ""

    No results matching ""