近日构建了一个图片服务器,想到全是图片需要设置防盗链,节省网站流量,于是在网上搜索资料,找到如下方法,测试管用,这里记录一下:

下面的防盗链代码是,当有人盗链时,直接返回403状态。
 

一、基本设置

   
   
   
   
  1. location ~* (\.jpg|\.png|\.gif|\.jpeg|\.png)$ { 
  2.  valid_referers none blocked www.yourweb.com  *.yourweb.com
  3.    if ($invalid_referer) { 
  4.       return 403; 
  5.    } 

下面这种防盗链方法是,当有人盗链时,直接显示我们预设的一张图片。

   
   
   
   
  1. location ~* (\.jpg|\.png|\.gif|\.jpeg|\.png)$ { 
  2.   valid_referers  none blocked  www.yourweb.com  *.yourweb.com; 
  3.   if ($invalid_referer) { 
  4. rewrite ^/p_w_picpaths/(.*)\.(gif|jpg|jpeg|png)$ http://www.yourweb.com/sorry.jpg last 
  5.   } 

 

二、工作原理

判断一个请求的Referer可以有效的防止盗链,使用nginx相应的HTTP Referer模块(HTTP Referer)可以实现此功能.当一个请求头的Referer字段中包含一些非正确的字段,这个模块可以禁止这个请求访问站点。


当然,这个头可以随意的伪造,因此,使用这个模块并不能100%的阻止这些请求。

上文代码解释:

valid_referers [none|blocked|server_names]
这个指令在referer头的基础上为 $invalid_referer 变量赋值,其值为0或1。
如果valid_referers列表中没有Referer头的值, $invalid_referer将被设置为1。

参数说明:

 ■none意为不存在的Referer头,比如浏览器直接访问。
 ■blocked意为根据防火墙伪装Referer头,如:“Referer: XXXXXXX”。
 ■server_names为一个或多个服务器的列表,0.5.33版本以后可以在名称中使用“*”通配符。如:*.yourweb.com

 

三、其他用法

搜索引擎考虑

如果你想在防盗链的同时,让搜索引擎访问你并收录你网站的图片,则改为:

   
   
   
   
  1. valid_referers none blocked yourdomain.com *.yourdomain.com p_w_picpath.baidu.com www.google.com;  

进一步防盗链

如上设置之后,其他网站调用的本站图片都已经作了防护了,但如果用户通过浏览器直接输入图片地址或下载地址,仍然会显示图片,仍可下载文件,因为 valid_referers 里多了“none blocked”。所以,把“none blocked”去掉可以防止用户通过浏览器或者其他工具批量下载。

不过这样做之后用户就不能直接通过浏览器访问图片了,从站点点击出来的还是可以显示。