插件窝 干货文章 如何使用nginx进行防盗链

如何使用nginx进行防盗链

Referer 防盗 配置 Nginx 333    来源:    2025-04-19

Nginx防盗链配置指南

防盗链(Referer-based Access Control)是防止其他网站直接链接到你服务器上的资源(如图片、视频、文件等)的一种技术。以下是使用Nginx实现防盗链的详细方法:

基本防盗链配置

location ~* \.(jpg|jpeg|png|gif|mp4|flv|swf|zip|rar|pdf|doc|docx|xls|xlsx|ppt|pptx)$ {
    valid_referers none blocked server_names
                  *.yourdomain.com
                  ~\.google\. ~\.bing\. ~\.yahoo\.
                  ~\.baidu\. ~\.so\. ~\.sogou\.
                  ~\.youdao\. ~\.yandex\.
                  ~\.facebook\. ~\.twitter\.;

    if ($invalid_referer) {
        return 403;
        # 或者可以返回一张替代图片
        # rewrite ^/.*$ /path/to/anti-hotlink.png break;
    }
}

配置说明

  1. location匹配~*表示不区分大小写的正则匹配,后面跟着需要保护的文件扩展名

  2. valid_referers:定义合法的来源

    • none:直接访问(无Referer头)
    • blocked:Referer头存在但被防火墙或代理删除
    • server_names:允许本服务器名访问
    • 自定义域名:可以添加允许的域名或正则表达式
  3. 处理非法引用:当Referer不在白名单中时,可以:

    • 返回403禁止访问
    • 重定向到一张替代图片

高级防盗链配置

1. 允许空Referer(直接访问)

valid_referers none blocked server_names ...

2. 允许搜索引擎抓取

valid_referers ... ~\.google\. ~\.bing\. ~\.yahoo\. ...

3. 使用map实现更复杂的规则

map $http_referer $bad_referer {
    hostnames;
    default         0;
    "~*spam-site\.com" 1;
    "~*scraper\.org"   1;
}

server {
    ...
    if ($bad_referer) {
        return 403;
    }
}

4. 结合secure_link模块实现更安全的防盗链

location /protected/ {
    secure_link $arg_md5,$arg_expires;
    secure_link_md5 "$secure_link_expires$uri$remote_addr secret";

    if ($secure_link = "") {
        return 403;
    }

    if ($secure_link = "0") {
        return 410;
    }
}

注意事项

  1. Referer可以被伪造:防盗链不是绝对安全的,Referer头可以被修改

  2. 影响用户体验:过于严格的规则可能会阻止合法用户访问

  3. 测试配置:修改后务必测试各种访问场景

  4. 性能考虑:正则表达式匹配会影响性能,尽量简化规则

  5. CDN兼容:如果使用CDN,需要确保CDN的Referer被允许

通过以上配置,你可以有效防止其他网站盗用你的服务器资源,节省带宽并保护内容版权。