插件窝 干货文章 Nginx如何设置Referer来防止盗图

Nginx如何设置Referer来防止盗图

Referer 配置 允许 Nginx 711    来源:    2025-04-27

Nginx 设置 Referer 防止盗图配置指南

通过 Nginx 的 Referer 检查可以有效防止其他网站盗用你的图片资源。以下是详细的配置方法:

基本配置方法

在 Nginx 配置文件中添加以下内容:

location ~* \.(jpg|jpeg|png|gif|webp)$ {
    valid_referers none blocked server_names
               *.yourdomain.com
               ~\.google\. ~\.bing\. ~\.yahoo\.
               ~\.baidu\. ~\.yandex\.
               ~\.facebook\. ~\.twitter\.;

    if ($invalid_referer) {
        return 403;
        # 或者可以返回一张警告图片
        # rewrite ^ /path/to/anti-hotlinking.jpg;
    }
}

配置说明

  1. 文件类型匹配~* \.(jpg|jpeg|png|gif|webp)$ 匹配常见的图片格式

  2. valid_referers 指令:定义合法的 Referer 来源

    • none:允许直接访问(无 Referer)
    • blocked:允许 Referer 被防火墙或代理删除的请求
    • server_names:允许本服务器名作为 Referer
    • 列出你的域名 *.yourdomain.com
    • 添加常见搜索引擎的域名(允许搜索引擎抓取)
    • 添加社交媒体域名(如果需要在社交平台分享)
  3. 非法访问处理

    • 返回 403 禁止访问
    • 或者重定向到一张警告图片

高级配置选项

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

valid_referers none blocked ...;

2. 允许特定 HTTP 头部的请求

valid_referers none blocked ...;
if ($http_referer ~* "^https?://([^.]+\.)?yourdomain\.com") {
    set $allow_access 1;
}
if ($http_user_agent ~* "(Googlebot|Bingbot|Yahoo|Slurp|DuckDuckBot|Baiduspider)") {
    set $allow_access 1;
}
if ($allow_access != 1) {
    return 403;
}

3. 使用 map 模块更灵活控制

map $http_referer $bad_referer {
    hostnames;
    default         0;
    "~yourdomain.com" 0;
    "~google.com"   0;
    "~bing.com"     0;
    "~facebook.com" 0;
    ""             1;  # 允许空referer
}

server {
    ...
    location ~* \.(jpg|jpeg|png|gif|webp)$ {
        if ($bad_referer) {
            return 403;
        }
    }
}

测试配置

  1. 测试配置是否正确:

    nginx -t
    
  2. 重载 Nginx:

    nginx -s reload
    
  3. 测试方法:

    • 直接访问图片URL - 应该能访问(如果配置了允许空Referer)
    • 从你的网站访问 - 应该能访问
    • 从其他网站iframe或img标签引用 - 应该返回403

注意事项

  1. Referer 可以被伪造,不能作为绝对安全的手段
  2. 搜索引擎爬虫通常会有正确的Referer,确保配置中允许它们
  3. 某些浏览器扩展或隐私模式可能会阻止Referer发送
  4. 考虑结合其他防盗链方法如签名URL、IP限制等提高安全性

通过以上配置,你可以有效减少其他网站盗用你的图片资源的情况。