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開始。