VCL示例
本节主要是有一些vcl小示例:
在VCL中操作请求头
比方说,我们想将/images目录下面的多有对象的cookie全部删除:
sub vcl_recv {
if (req.url ~ "^/images") {
unset req.http.cookie;
}
}
这样当请求被后端处理时在http的header中将不再有cookie信息。在这里面是使用if语句。在匹配的URL中,也支持正则表达式。注意匹配操作符,它匹配了cookie,然后在请求头中将其删除。
修改后端响应
在这里,如果匹配到当前规则我们可以重新设置从后端响应的对象的TTL:
sub vcl_backend_response {
if (bereq.url ~ "\.(png|gif|jpg)$") {
unset beresp.http.set-cookie;
set beresp.ttl = 1h;
}
}
我们也移除http头中的Set-Cookie,是为了避免hit-for-pass对象被创建。
ACLs
你可以使用acl关键字创建一个权限控制列表。你可以让客户端的ip地址匹配到acl列表,使用匹配操作:
# Who is allowed to purge....
acl local {
"localhost";
"192.168.1.0"/24; /* and everyone on the local network */
! "192.168.1.23"; /* except for the dialin router */
}
sub vcl_recv {
if (req.method == "PURGE") {
if (client.ip ~ local) {
return(purge);
} else {
return(synth(403, "Access denied."));
}
}
}
添加WebSockets支持
WebSockets是一种用于创建基于HTTP的双向基于流的通道的技术。为了通过Varnish运行WebSockets你需要用管道传递它,并复制Upgrade头。使用下面的VCL来实现:
sub vcl_recv {
if (req.http.upgrade ~ "(?i)websocket") {
return (pipe);
}
}
sub vcl_pipe {
if (req.http.upgrade) {
set bereq.http.upgrade = req.http.upgrade;
}
}