LLEARNING NOTES

技术 · 思考 · 实践 · 成长

首页/Nginx专栏/正文

Nginx图片防盗链

Nginx专栏662 次阅读

一、什么是图片防盗链

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

二、防盗链原理

使用三种方法解决盗链问题,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


生活的强者,不是指能搞定一切困难,也不是指没有恐惧,而是就算心里藏着无尽的疲惫和委屈,还是会认真地做好手头上的事情;就算自己被生活锤得心灰意冷,还是会尽心尽力地负起责任;就算发现现实与理想的差距有十万里,虽然鞭长莫及,却依然马不停蹄。

评论交流

理性讨论,共同进步
验证码

相关文章

继续阅读