在sub vcl_recv 函数中加入下面代码,注意应放在第一段位置。
if (req.http.referer ~ "http://*.*") {
if ( !(req.http.referer ~ "http://lvtrm.readeing.com"|| req.http.referer ~ "http://*.google\.com"|| req.http.referer ~ "http://*.baidu\.com"|| req.http.referer ~ "http://*.google\.com.cn" || req.http.referer ~ "http://*.yahoo\.cn")) {
set req.http.host = "lvtrm.readeing.com";
error 403 "Please visit lvtrm.readeing.com";
}
return (lookup);
}
}
在这段配置中,用了一个内置变量“req.http.referer”,防盗链就是通过referer 来实现的。其实,referer是http header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上一个referer标识,用来告诉服务器请求是从哪个页面链接过来的,服务器根据这个标识就可以获取信息来源,进而进行相应的处理。这段配置的含义为:Varnish服务器对接收或发送的请求进行判断,如果referer标识存在,且referer标识不匹配下面域名列表中的任意一个,就将请求重定向到lvtrm.readeing.com域名,并返回403错误“Please visit lvtrm.readeing.com”,也可以用set req.url = "/images/logo.gif";重定向某一图片上,而对找到匹配域名的请求执行lookup操作。