盗链是指在自己的页面上展示一些并不在自己服务器上的内容。通常的做法是通过技术手段获得他人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。比较常见的是一些小站盗用大站的资源(图片、音乐、视频),对于这些小站来说,通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。对大站造成的影响确实增加了服务器压力,用户还不是自己的。
防盗链就是防止这种行为的产生,实施防盗链系统后,因为屏蔽了那些盗链的间接资源请求,从而可以大大减轻服务器及带宽的压力,也正如此,越来越多的站点都开始实施防盗链技术。
防盗链配置(两种方法)
方法一、Apache防盗链的第一种实现方法,可以用rewrite实现。
(1)首先要确认Apache的rewrite module可用:
[root@global ~]# httpd -M | grep rewrite
rewrite_module (shared)
(2)在Apache主配置文件中找到对应的位置(或虚拟主机中),加入下列代码:
#防盗链配置
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !a\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.a\.com/.*$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ - [F]
(3)重启Apache服务,并在客户端上进行访问验证:
[root@global images]#curl -e "www.qq.com" -x127.0.0.1:8090 a.com/images/test.jpg -I
看出区别了吗,返回码200是正常,返回码403是禁止。
相关选项的解释
1.RewriteEngine On #启用rewrite,要想rewrite起作用,必须要写上
2.RewriteCond test-string condPattern #写在RewriteRule之前,可以有一或N条,用于测试rewrite的匹配条件。
3.RewriteRule Pattern Substitution #规则
4. %{HTTP_REFERER}:服务器变量,HTTPReferer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
5.[ NC]指的是不区分大小写, [R]强制重定向redirect
6.字母L表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则
说明:
1. RewriteCond:表示自己的信任站点。对我的站点来说,设置为 http://www.a.com和 http://a.com
2. RewriteRule:要保护文件的扩展名(以|分开)。以这些为扩展名的文件,必须通过RewriteCond的网址引用,才可以访问。
3. RewriteRule:定义被盗链时替代的图片,让所有盗链 jpg、gif、swf 等文件的网页,显示网页文档根目录下的images/ test.png 文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。
直接禁用盗链:RewriteRule .*\.(gif|jpg|png)$ - [F]
将盗链替换成指定图片 RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]
注:[F] (强制URL为被禁止的forbidden),强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。
方法二、通过判断浏览器头信息来阻止某些请求,即利用SetEnvIfNoCase和access。这个方法可以通过阻止某些机器人或蜘蛛爬虫抓取你的网站来节省你的带宽流量。
SetEnvIfNoCase Referer "^$" local_ref
SetEnvIfNoCase Referer "www.a.com/.*$" local_ref
SetEnvIfNoCase Referer "a.com/.*$" local_ref
Order Deny,Allow
Allow from env=local_ref
Deny from all
Referer :指明了请求当前资源原始资源的URL,使用referer是可以防盗链
其实和第一种方式很像,使用SetEnvIfNoCase 匹配某些允许的条件,没有匹配的就直接拒绝,这里演示结果就不展现了。