盗链的定义:
此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。
为什么会产生盗链:
一般浏览有一个重要的现象就是一个完整的页面并不是一次全部传送到客户端的。如果请求的是一个带有许多图片和其它信息的页面,那么最先的一个Http请求被传送回来的是这个页面的文本,然后通过客户端的浏览器对这段文本的解释执行,发现其中还有图片,那么客户端的浏览器会再发送一条Http请求,当这个请求被处理后那么这个图片文件会被传送到客户端,然后浏览器会将图片安放到页面的正确位置,就这样一个完整的页面也许要经过发送多条Http请求才能够被完整的显示。基于这样的机制,就会产生一个问题,那就是盗链问题:就是一个网站中如果没有起页面中所说的信息,例如图片信息,那么它完全可以将这个图片的连接到别的网站。这样没有任何资源的网站利用了别的网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现,这样显然,对于那个被利用了资源的网站是不公平的。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担。
如何在nginx下配置防盗链:
location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv|mp4)$ { valid_referers none blocked *.chaihongjun.me chaihongjun.me; if ($invalid_referer) { #rewrite ^/ https://chaihongjun.me/403.html; return 403; }
第一行表示对wma,wmv等文件防盗链
第二行判断来路,这里的域名可以根据实际情况设置,然后判断请求是不是来自设置的域名,如果不是则返回Http403。
这个是针对全站特定的文件格式,另外如果用户知道以上文件路径,直接在浏览器中访问以上文件的完整URL,则可以正常访问文件。
如果希望用户即使知道资源路径,直接在浏览器输入完整URL,还是不能访问的话,需要这样设置:
location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv|mp4)$ { valid_referers *.chaihongjun.me chaihongjun.me; if ($invalid_referer) { #rewrite ^/ https://chaihongjun.me/403.html; return 403; }
其实就是把“none blocked
”删除。
如果希望防盗链,并且返回的一张我们设定好的图片:
location ~* (wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv|mp4)$ { valid_referers none blocked *.chaihongjun.me chaihongjun.me; if ($invalid_referer) { rewrite ^/images/(.*).(gif|jpg|jpeg|png)$ https://chaihongjun.me/banner.jpg last } }
再来高级点的,如果希望开个后门,让google,baidu域名可以访问本站资源:
location ~*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ { valid_referers none blocked *.chaihongjun.me server_names ~\.google\. ~\.baidu\. ; if ($invalid_referer) { #rewrite ^/ https://chaihongjun.me/403.html; return 403; } }
~是正则表达式,表示排除https://或http://开头的字符串
server_names Referer”来源头部包含当前的server_names(当前域名),当域名里面含有google,baidu的时候防盗链忽略。
上面的方法可以抵御一般正常的盗链行为,如果想变态一些,直接在浏览器放图片或者其他资源,则去掉none blocked:
location ~*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv|js)$ { valid_referers *.chaihongjun.me server_names ~\.google\. ~\.baidu\. ~\.so\. ~\.sogou\.; if ($invalid_referer) { #rewrite ^/ https://chaihongjun.me/403.html; return 403; } }