一般我们使用的主机每月都有固定的流量,如果当月额度用完服务器可能会暂停,有些是占用太大的流量会影响网站的访问速度。所以,我们在有必要的前提下可以设置服务器的图片或者其他静态资源防盗链。
在这篇文章中,整理我们常用的Nginx和Apache环境中设定防盗链的办法。
一.nginx防盗链
1)基本方式(ngx_http_referer_module模块)
找到nginx的配置文件conf,
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
expires 30d;access_log off;valid_referers none blocked *.laobuluo.com server_names ~\.google\. ~\.baidu\.;if ($invalid_referer) {
#rewrite ^/ http://www.chinaz.com/403.html;return 403;}
}
配置解析:
在新建location段中加入:valid_referers none blocked,
其中none表示空的来路,也就是直接访问,
比如直接在浏览器打开一个文件,blocked表示被防火墙标记过的来路,*.xxx.com表示所有子域名。
第一行:定义了当访问资源为gif/jpg/png/bmp文件
第二行:30天
第三行 :关闭日志
第四行:valid_referers这个关键字定义了白名单
第五行:invalid_referer是内置变量,通过判断上一行中的valid_referers值会返回0或者1,
none代表请求头中没有referer信息,这一般是直接在浏览器输入图片网址
blocked代表被防火墙过滤标记过的请求
第六行:如果访问来源不在白名单内,则返回403错误
第七行:可以通过设定指定的图片来代替目标图片
这种实现可以限制大多数普通的非法请求,但不能限制有目的的请求,因为这种方式可以通过伪造referer信息来绕过
2) 使用http_accesskey_module模块或lua脚本实现
原理如下:不通过referer信息判断,通过约定url后的参数key的值(加密)来判断是否是合法来源。
二.Apache 防盗链的第一种实现方法,可以用rewrite实现。
首先要确认 Apache 的rewrite module可用:
[root@www~]# apachectl -M | grep rewrite
rewrite_module (shared)
打开 httpd.conf,确保有这么一行配置:
LoadModule rewrite_modulemodules/mod_rewrite.so
然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),加入下列代码:
ServerName www.benet.com
#防盗链配置
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]
RewriteRule.*\.(gif|jpg|swf)$http://www.benet.com/about/p_w_picpath.png [R,NC,L]
注:相关选项的解释
1.RewriteEngineOn #启用rewrite,要想rewrite起作用,必须要写上
2.%{HTTP_REFERER}:服务器变量,HTTPReferer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
3.[ NC]指的是不区分大小写,[R]强制重定向 redirect
4.字母L表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则
注:相关配置的解释
1.RewriteCond %{HTTP_REFERER}!^$ 上面这一行意在允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。
2.RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]
设置允许访问的HTTP来源,包括网站自身。
3.RewriteRule .*\.(gif|jpg|swf)$http://www.benet.com/about/p_w_picpath.png[R,NC,L]
定义被盗链时替代的图片,让所有盗链 jpg、gif、swf 等文件的网页,显示网页文档根目录下的about/ p_w_picpath.png 文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。当然你也可以不设置替换图片,而是使用下面的语句即 可:RewriteRule.*\.(gif|jpg|png)$ - [F]
注:[F] (强制URL为被禁止的 forbidden),强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。
注意:测试时要清除济浏览器缓存
有些用户使用的是虚拟主机,没有服务器的控制权,无法修改 httpd.conf 文件和重启服务器。那么请确认你的虚拟主机支持 .htaccess,将上面的配置写入 .htaccess 文件,放入根目录或图片所在的目录即可:
通过判断referer变量的值,判断图片或资源的引用是否合法,只有在设定范围内的 referer,才能访问指定的资源,从而实现了防盗链(Anti-Leech)的目的。需要指出的是:不是所有的用户代理(浏览器)都会设置 referer 变量,而且有的还可以手工修改 referer,也就是说,referer 是可以被伪造的。本文所讲的,只是一种简单的防护手段