插件窝 干货文章 Nginx怎么搭建文件防盗链服务

Nginx怎么搭建文件防盗链服务

yourdomain 防盗 Referer Nginx 769    来源:    2025-04-27

Nginx搭建文件防盗链服务指南

文件防盗链可以防止其他网站直接链接你的资源(如图片、视频、文档等),从而节省你的带宽和服务器资源。以下是使用Nginx搭建防盗链服务的详细方法:

基本防盗链配置

1. 基于Referer的防盗链

server {
    listen 80;
    server_name yourdomain.com;

    location ~* \.(jpg|jpeg|png|gif|mp4|pdf)$ {
        valid_referers none blocked yourdomain.com *.yourdomain.com;

        if ($invalid_referer) {
            return 403;
            # 或者可以重定向到一张警告图片
            # rewrite ^ /anti-hotlinking.jpg;
        }
    }
}

2. 配置说明

  • valid_referers:定义合法的来源
    • none:直接访问(无Referer)
    • blocked:Referer存在但被防火墙或代理删除
    • yourdomain.com:允许的主域名
    • *.yourdomain.com:允许的子域名

高级防盗链配置

1. 使用签名防盗链(更安全)

server {
    listen 80;
    server_name yourdomain.com;

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

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

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

需要配合生成签名的代码(如PHP):

$secret = 'your_secret_key';
$expires = time() + 3600; // 链接1小时后失效
$path = '/protected/file.jpg';
$hash = md5($expires . $path . $secret);

$url = "http://yourdomain.com{$path}?md5={$hash}&expires={$expires}";

2. 使用Nginx的ngx_http_secure_link_module

location /download/ {
    secure_link $arg_st,$arg_e;
    secure_link_md5 "your_secret_key$uri$arg_e";

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

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

防盗链优化技巧

  1. 白名单模式:只允许特定域名访问

    valid_referers none blocked server_names
                  *.yourdomain.com
                  partner.com
                  *.trusted.com;
    
  2. 黑名单模式:禁止特定域名访问

    if ($http_referer ~* (spammer.com|badsite.com)) {
       return 403;
    }
    
  3. 伪装资源:对于盗链请求返回替代内容

    location ~* \.(jpg|jpeg|png|gif)$ {
       valid_referers blocked yourdomain.com *.yourdomain.com;
    
       if ($invalid_referer) {
           rewrite ^ /fake-image.jpg;
       }
    }
    
  4. 限制特定文件类型

    location ~* \.(mp4|mov|avi|flv)$ {
       valid_referers none blocked yourdomain.com;
       if ($invalid_referer) {
           return 403;
       }
    }
    

测试防盗链

  1. 直接访问资源URL - 应该能访问(如果配置了none
  2. 从允许的域名链接访问 - 应该能访问
  3. 从未允许的域名链接访问 - 应该返回403或你设置的其他响应

注意事项

  1. Referer可以被伪造,所以基于Referer的防盗链不是绝对安全的
  2. 对于重要资源,建议使用签名防盗链方法
  3. 配置修改后记得重载Nginx:nginx -s reload
  4. 某些浏览器或隐私模式可能会不发送Referer,需要考虑这种情况

通过以上配置,你可以有效地保护服务器上的资源不被其他网站盗用,节省带宽和服务器资源。