一、什么是图片防盗链
图片防盗链是为了防止其他站点从本网站引用图片等连接,导致消耗网站的资源和流量
二、防盗链原理
使用三种方法解决盗链问题,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