防盗链
盗链是指有一些不良网站,为了在不增加成本的前提下扩充自己站点的内容,直接盗用其他网站的资源链接,而大部分用户又不会发现。这样的做法一方面损害了原网站的合法利益,另一方面又加重了原网站服务器的流量负担
图片防盗链
图片是一个网站中最容易被盗取的资源,如何使用Nginx来保护图片不被盗链呢?在讲解之前,首先要了解HTTP请求消息中的一个名称为referer的字段,它用于保存当前网页的来源URL地址。当用户打开一个含有图片内容的网页时,浏览器会在图片的请求消息中将网页的URL放在referer中,从而使图片所在的服务器能够跟踪到它被显示的网页地址。
因此,若要实现图片防盗链,最简单的防护手段就是判断referer的值,来判断当前图片的引用是否合法,一旦检测到来源不是本站,就立即阻止图片的发送,或换成一张禁止防盜链提示的图片。
1. 准备两个网站:
在nginx. conf文件中,配置两个虚拟主机www. ng. test和www. test. com,用于在网站www. test. com中盗用网站www. ng. test中的图片链接,配置如下:
server {
listen 80;
server_name www.ng.test;
root html/ng.test;
index index.html index.htm;
}
server {
listen 80;
server_name www.test.com;
root html/test.com;
index index.html index.htm;
}
接下来,在网站www. ng. test的目录html/ng. test中创建img子目录,用于存放网页中的图片资源。然后,分别在网站www.ng.test和www.test.com中创建测试网页,具体如下。
(1) 在网站www. ng. test下,创建index. html文件,用于展示自己网站中的图片,内容如下:
(2) 在网站www.test.com中盗用网站www.ng.test中的图片链接,index.html的内容如下:
准备完成后,在浏览器中分别访问网站http://www.ng.test
http://www.test.com
从图中可以看出www. test. com网站从www. ng. test中盗链成功。
2. 配置防盗链:
接着,修改网站 www.ng.test的 server 配置,添加允许文件链出的域名白名单,具体设置如下:
location ~*\.(gif|jpg|png|swf|flv)$ {
valid_referers www.ng.test ng.test;
if ($invalid_referer) {
return 403;
}
}
上述第1行配置,用于匹配文件扩展名为gif、jpg、png、swf、flv
的资源;第2行中的valid_referers 指令用于设置允许访问资源的网站列表(即白名单)。当请求消息头中的referer符合白名单时,内置变量$invalid_referer的值为空字符串,否则为1
。因此,通过第3~5行的配置,可以禁止白名单之外的网站访问资源,并返回403状态码。
白科值得一提的是,valid_referers 指令的参数可以叠加设置,中间使用空格分隔即可。关于valid_referers指令后可以设置的参数值以及相关说明如表:
3. 验证测试:
访问:www.ng.test
:
访问:www.test.com
需要注意的是,不是所有的浏览器都会发送referer 请求头,并且referer的值还可以被客户端随意修改。也就是说,referer是可以被伪造的。因此,上述讲解的方式只能用于防范普通用户对图片资源的盗用。