一、什么是图片防盗链
图片防盗链是为了防止其他站点从本网站引用图片等连接,导致消耗网站的资源和流量
二、防盗链原理
使用三种方法解决盗链问题,Referer模块、AccessKey模块 或者 Secure Link模块,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理
首先在服务器42.192.180.238中准备一张原始图片:
在第二台服务器中引用服务器1的图片:
当在服务器1中设置防盗链时:
那么服务器2访问则失败
三、语法
通过模块ngx_http_referer_module模块和$invalid_referer变量
valid_referers none | blocked | server_names | string ...;
可用于:server,location块
参数:
none:请求标头中缺少“Referer”字段,也就是说Referer为空,浏览器直接访问的时候Referer一般为空 blocked: Referer”字段出现在请求标头中,但其值已被防火墙或代理服务器删除; 这些值是不以“http://” 或 “https://” 开头的字符串; server_names: 服务器名称,也就是域名列表
四、配置方法
针对不同文件类型
server { listen 80; server_name www.test.test; root html/test.test; index index.html index.htm; autoindex on; # 指定需要防盗链资源的文件类型 location ~* \.(gif|jpg|png|swf|flv)$ { # 图片防盗链主要指令 root /data/wwwroot/www.ixdba.net; # 这里可以是ip或者域名 valid_referers *.gyzth.top; if ($invalid_referer){ # 如果有人非法盗链资源,则返回一张防盗链的图片 # rewrite ^/ https://www.27wy.cn:90/picture/images/details-image-1.jpg; # 或者返回一个状态码 return 403; } } }
针对不同目录
location /img/ { root /data/img/; valid_referers none blocked *.gyzth.top gyzth.top; if ($invalid_referer) { rewrite ^/ http://www.gyzth.top/images/error.gif; #return 403; } }
如果允许部分的域名可以访问,其他访问一律禁止,那么需要设置防盗链白名单:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico|webp)$ { valid_referers none blocked *.xiaoz.me *.xiaoz.top; if ($invalid_referer) { return 403; } }
如果需要将部分域名加入黑名单,其他域名一律可以访问,那么需要设置防盗链黑名单:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico|webp)$ { valid_referers *.baidu.com; if ($invalid_referer = 0) { return 403; } }
配置完成后,重载Nginx配置文件 ,访问测试即可
/usr/local/nginx/sbin/ngins -s reload