varnish從C繼承了很多,同時它讀起來像簡單的C或者是Perl。
塊由大括號分隔,語句用分號結束,注釋可以根據自己的喜好來寫為C,C ++或Perl的注釋。
注意VCL不包含任何循環和跳轉語句。
本節提供大致最重要部分的語法。完整的VCL語法文檔請查看https://www.varnish-cache.org/docs/4.0/reference/vcl.html#reference-vcl
基本的字符是被雙引號引起來,像"...",同時不可以跨行。 反斜槓不是特別的,例如regsub你不需要對\進行轉義:
regsub("barf", "(b)(a)(r)(f)", "\4\3\2p") -> "frap"
長字符應該被{"..."}。它們可以包含任何字符包括"、跨行、除了NUL(0×00)字符等控制字符。如果你真的想字符串中使用NUL字符,VMOD,使得它可以創建這樣的字符串。
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); }
下面這些操作時可以在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開始。