🔒 Nginx 实现图片防盗链(基于 Referer)

Nginx 支持使用 $invalid_referer 变量 + ngx_http_referer_module 模块实现图片防盗链功能,防止他人通过外链引用你的图片资源,从而浪费带宽和服务器资源。


🧩 防盗链实现方式概览

实现方式 原理 适用场景
Referer 校验 校验访问资源时 header 中的 referer 来源 通用 + 简单配置
签名 URL 为资源请求生成签名参数,校验签名合法性 更高级、API防盗场景

本文聚焦于轻量级的 Referer 校验方式。


🚀 开启 Referer 防盗链功能

Referer 防盗链依赖模块:ngx_http_referer_module(大多数官方编译版本已内置)

支持配置范围:serverlocation 块中


✅ 配置示例(按文件扩展名过滤)

下面示例仅允许 xxx.cn / *.xxx.cn 网站引用本服务器的图片资源:

server {
    listen 80;
    server_name yourdomain.cn;
    root /usr/share/nginx/html;

    location ~*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        valid_referers none blocked xxx.cn *.xxx.cn;
        if ($invalid_referer) {
            return 403;
        }
    }
}

关键解释:

  • valid_referers none blocked xxx.cn *.xxx.cn
    • 表示允许 referer 是空(none)、被屏蔽(blocked)、或来自 white-list 域名(xxx.cn)。
    • 如果你想严格控制,移除 none blocked (建议做法)。

🔧 简洁示例(针对路径)

如果你把静态资源统一暴露在 /static 路径下,也可以使用如下配置:

location /static {
    valid_referers *.xxx.cn;
    if ($invalid_referer) {
        return 403;
    }

    alias /static;  # 实际静态文件目录
}

⚠️ 注意:alias 需要与 ‘/static’ 目录结构对应,不能误指。


📌 指令说明:valid_referers

参数 说明 是否推荐
none 允许没有 Referer 头的请求(如浏览器直接输入 URL、某些编程请求) ❌ 不推荐
blocked 允许 Referer 存在但被中间设备清除(如某些代理) ❌ 不推荐
域名 明确指定允许使用资源的来源,支持通配符,如 *.example.com ✅ 推荐

若不包含 none / blocked,则表示:

只有明确 Referer 且来源于你配置的域名,才能访问目标资源,任何其他都被视为 $invalid_referer = true

🧠 实战建议

  • 移除 none 和 blocked,增强防盗链强度

  • 若你需要兼容早期浏览器、内网等客户端,可适当保留 none

  • 推荐统一使用相对路径指向资源,例如:

    <img src="/static/img/logo.png">
  • 不建议信任 Referer 来做强安全限制,Referer 可被轻易伪造,仅用于普通防盗链、轻量保护场景


🚫 防盗链生效但仍被绕过的常见原因

问题 常见原因说明
浏览器能加载但还是浪费流量? 用户已从合法站点点击,Referer 是合法页面
Referer 不生效 某些客户端会清除/篡改 Referer
某些 CDN 节点绕过防盗链? CDN 可能请求时使用自身域名或更换 Referer

✅ 总结

  • Referer 防盗链是 Nginx 提供的一种轻量防盗策略
  • 配置中的 valid_referers 是关键,白名单应精确合理
  • 强安全防盗需求场景(如付费下载)建议引入「时间戳 + 签名」URL 验证机制(或基于 JWT 授权)

📚 拓展阅读:

作者:freed  创建时间:2025-03-28 14:40
最后编辑:freed  更新时间:2025-03-28 14:40