1. 什么是资源盗链

  资源盗链指的是此内容不在自己服务器上,而是通过技术手段,绕过别人的限制将别人的内容放到自己页面上最终展示给用户,以此来盗取大网站的空间和流量。简而言之就是用别人的东西成就自己的网站。
  效果演示,下面是京东和百度的两张图片:
  京东:https://img14.360buyimg.com/n7/jfs/t1/101062/37/2153/254169/5dcbd410E6d10ba22/4ddbd212be225fcd.jpg
  百度:https://pics7.baidu.com/feed/cf1b9d16fdfaaf516f7e2011a7cda1e8f11f7a1a.jpeg?token=551979a23a0995e5e5279b8fa1a48b34&s=BD385394D2E963072FD48543030030BB
  引用两张图片:


  效果:


  可以看出,百度的图片添加了防止盗链的功能,而京东的图片可以直接使用。

2. Nginx防盗链的实现原理

  讲防盗链的原理之前,我们得先了解一个 HTTP 的头信息 Referer,当浏览器向 Web 服务器发送请求的时候,一般都会带上 Referer,来告诉浏览器该网页是从哪个页面链接过来的。


  后台服务器可以根据获取到的这个 Referer 信息来判断是否为自己信任的网站地址,如果是则放行继续访问,如果不是则可以返回 403(服务端拒绝访问)的状态信息。
  Nginx 防盗链的具体实现:
  valid_referers: Nginx 会通就过查看 referer 自动和 valid_referers 后面的内容进行匹配,如果匹配到了就将$invalid_referer变量置 0,如果没有匹配到,则将$invalid_referer变量置为 1,匹配的过程中不区分大小写。

语法 valid_referers none|blocked|server_names|string…
默认值 -
位置 server、location
  • none:如果 Header 中的 Referer 为空,允许访问;
  • blocked:在 Header 中的 Referer 不为空,但是该值被防火墙或代理进行伪装过,如不带http://https://等协议头的资源允许访问;
  • server_names:指定具体的域名或者 IP;
  • string:可以支持正则表达式和*的字符串。如果是正则表达式,需要以~开头表示,例如:
1
2
3
4
5
6
7
location ~*\.(png|jpg|gif){
valid_referers none blocked www.baidu.com 10.7.2.205 *.example.com example.* www.example.org ~\.google\.;
if ($invalid_referer){
return 403;
}
root /usr/local/nginx/html;
}

  那么现在问题来了,图片有很多,该如何批量进行防盗链?

3. 针对目录进行防盗链

  配置如下:

1
2
3
4
5
6
7
location /images {
valid_referers none blocked www.baidu.com 10.7.2.205 *.example.com example.* www.example.org ~\.google\.;
if ($invalid_referer){
return 403;
}
root /usr/local/nginx/html;
}

  这样我们可以对一个目录下的所有资源进行翻到了操作。
  还有一个问题:Referer 的限制比较粗,比如随意加一个 Referer,上面的方式是无法进行限制的。那么这个问题改如何解决?
  此处我们需要用到 Nginx 的第三方模块ngx_http_accesskey_module,第三方模块如何实现盗链,如何在 Nginx 中使用第三方模块的功能,这些我们在后面的 Nginx 的模块篇再进行详细的讲解。

参考文献

  【1】https://www.bilibili.com/video/BV1ov41187bq?p=64