计算机网络/计算机科学与应用/系统/运维/开发

Nginx图片防盗链

一、什么是图片防盗链

图片防盗链是为了防止其他站点从本网站引用图片等连接,导致消耗网站的资源和流量

二、防盗链原理

使用三种方法解决盗链问题,Referer模块、AccessKey模块 或者 Secure Link模块,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理


首先在服务器42.192.180.238中准备一张原始图片:

image.png

在第二台服务器中引用服务器1的图片:

image.png


当在服务器1中设置防盗链时:

image.png

那么服务器2访问则失败

image.png

三、语法

通过模块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


nginx

好的习惯,排名第一的是:自律;排名第二的是:终身学习;排名第三的是:保持运动。拥有这三种习惯,美好人生垂手可得。

评论

^