何谓‘盗链’
此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。
比较明显的是图片资源,自己的服务器不存储图片资源,而使用别人的图片资源,这样无需承担图片的存储跟流量所产生的费用。总之,是非常无耻的行径。
如何防盗链
要实现防盗链,需要了解HTTP协议中的请求头部 Referer 头域和采用 URL 格式表示访问当前网页或者文件的源地址。通过该头域的值,我们可以检测到访问目标资源的源地址,即我们知道是谁在访问我们的资源。这样,如果检测到 Referer 头域中的值并不是自己站点的URL,就采取阻止措施,实现防盗链。
Nginx 指令 valid_referers
Nginx 配置中有一个指令 valid_referers ,用来获取 Referer 头域中的值,并且根据该值的情况给 Nginx 全局变量 $invalid_referer 变量将会被赋值为 1。valid_referers 指令的语法为:valid_referers none | blocked | server_names | strings ....;
- none, 检测 Referer 头域不存在的情况。
- blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头。
- server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。
有了 valid_referers 指令和 $invalid_referer 变量,就能通过 Rewrite 功能来实现防盗链。有两种实现方案,一种是根据请求资源的类型,一种是根据请求目录。以请求资源类型为例子:
location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|jpeg|png|swf|flv)$ {
valid_referers none blocked *.myweb.com;
if ($invalid_referer) {
rewrite ^/ http://www.myweb.com/logo.gif;
#return 403;
}
}