一、什么是盗链
盗链概念:
盗链是指在自己的页面上展示一些并不在自己服务器上的内容。
例如:
我将CSDN
的logo
地址放到了我的线上服务器上:
这样,通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。受益的是自己,别人反而得到了损失
下面的动图应该很形象的说明了吧,哈哈:
二、什么是防盗链
通过Referer或者签名,网站可以检测目标网页访问的来源页,如果是指定的网站或符合条件的网站,就可以跟踪到显示它的网页地址。
三、配置nginx
方式一:通过Referer
,网站可以检测目标网页访问的来源网页是否合法
参数说明:
参数名 | 含义 |
---|---|
none | 允许没有http_refer的请求访问资源 |
blocked | 允许不是http://开头的,不带协议的请求访问资源 |
server_names | 表示一个或多个主机名称。从Nginx 0.5.33版本开始,server_names中可以使用通配符"*"号。 |
进行测试:
1、首先在我这个mydemo
站点下放了一个1.jpg
:
2、在没配置防盗链的情况下,另一个站点使用该图片的地址:
3、没问题,正常访问:
4、加上防盗链后继续访问:
5、显示了csdn的logo,这是nginx配置中如果来源网页不合法则可以自定义一个图片地址。
方式二:通过第三方模块HttpAccessKeyMoudule
来进行加密签名
参数说明:
参数名 | 含义 |
---|---|
accesskey on或off | 模块开关 |
accesskey_hashmethod md5或sha-1 | 签名加密方式 |
accesskey_arg | 参数名称 |
accesskey_signature | 加密规则 |
在请求图片的加上testpass
和ip地址
md5加密后的参数即可:
<?php
$sign = md5('testpass'.$_SERVER['REMOTE_ADDR']);
echo '<img src="http://mydemo.xxxxxxxx.cn/image/1.jpg?sign="$sign">';
其中,服务端与客户端约定一个参数和参数值的生成方式即可。
四、小结
至此,是nginx配置防盗链的两种方式,由于第一种可能会导致伪造refer,推荐使用第二种方式。