为什么要配置防盗链

  • A是某一网站站长,A网站中的图片和音频视频链接等静态资源都保存在对象存储OSS上或者本地。

  • B是另一网站的站长,B在未经A允许的情况下使用A网站的图片资源,放置在自己网站的网页中,通过这种方法盗取空间和流量。这样的情况下,第三方网站用户看到的是B网站,但并不清楚网站里的图片来源。

  • OSS是收费的,这样用户A在没有获取任何收益的情况下,反而承担了资源使用费用,并且B在没有经过允许的情况下适用这些资源也是侵害了A的合法权益。

综上,为了防止B这一类人的不法侵害,需要使用防盗链进行防护

配置防盗链的方法

要实现防盗链,需要了解HTTP协议中的请求头部的Referer头域和采用URL的格式表示访问当前网页或者文件的源地址。通过该头域的值,我们可以检测到访问目标资源的源地址。这样,如果我们检测到Referer头域中的值并不是自己站点内的URL,就采取阻止措施,实现防盗链。

Nginx的valid_referers可以配置相关防盗链的行为

**Syntax:   valid_referers none | blocked | server_names | string ...;
Default:    —
Context:    server, location
#搜索匹配不区分大小写

Parameters can be as follows:
none                #检测Referer头域不存在的请求
blocked             #检测Referer头域的值被防火墙或者代理服务器删除或伪装的情况,这种情况头域不以http:// https:// 开头
server_names        #设置一个或多个URL,检测Referer头域的值是否是这些URL中的某个
arbitrary string    #定义一个服务器名称和一个可选的URI前缀。服务器名可以在开头或结尾有“*”。检查时,“Referer”字段中的服务器端口被忽略

这些语法含义指的是,valid_referers配置白名单对请求的头域进行匹配,匹配的值就是$invalid_referer,根据获得的这个值,进行if条件判断,然后进行rewrite。

示例

#匹配文件类型
location ~* \.(gif|jpg|png|jpeg|flv|swf|rar|zip)$ {
    expires     30d;
#允许文件链出的域名白名单,域名之间空格隔开
    valid_referers none blocke *.A.com www.A.com;
#if判断为真
if ($invalid_referer) {
#防盗链图片替换所有盗链图片
    rewrite ^/ http://www.A.com/404.jpg;
    }
}
  • 为了彻底实现真正的防盗链,可以将none、blocked删除
  • 防盗链返回图片可以rewrite成图片,也可以是链接

完成防盗链配置,可以在请求头里面看到Host头的指向,会只看到A.com。

02-11 22:12