在蓝易云 CDN 这类多节点架构里,合理利用 Nginx 的 <span style="color:red">referer</span> 能把防盗链、流量治理和来源统计捏在一起做好。下面我直接拆开讲原理 + 配置方法 + 注意事项,尽量说人话,但技术细节一个都不落下 🙂


一、referer 的本质:浏览器带来的“来源线索”

  1. 浏览器在发起请求时,会把当前页面地址写进 HTTP 头部 <span style="color:red">Referer</span> 字段。
  2. Nginx 会把这个头映射成变量:<span style="color:red">$http_referer</span>,供后续指令判断。
  3. 在 CDN 场景下:

    • 用户 → 蓝易云 CDN 节点:Referer 通常是业务站点页面地址。
    • CDN 节点 → 源站 Nginx:Referer 一般会被原样转发,或者由前置层二次设置(取决于你在 CDN 侧的配置)。

⚠️ 关键认知:

  • <span style="color:red">Referer 可以被伪造</span>,不能当强安全手段。
  • HTTPS → HTTP、隐私插件、部分小程序/客户端,会直接不带 Referer。
  • 所以 referer 适合做的是:<span style="color:red">防止低成本盗链 + 过滤明显异常流量</span>,而不是绝对防御。

二、Nginx referer 模块的三个关键点

Nginx 里和 Referer 相关的核心指令在 ngx_http_referer_module 中,主要就三件事:

  1. <span style="color:red">valid_referers</span>:定义什么是“合法来源”。
  2. <span style="color:red">$invalid_referer</span>:自动标记当前请求是否是非法来源(1 = 非法,0 = 合法)。
  3. referer_hash_max_size / referer_hash_bucket_size:高并发、大量域名白名单时的哈希表容量调优。

理解成一句话:

你用 valid_referers 画出一圈“可信域名”,Nginx 用 $invalid_referer 告诉你当前请求在圈内还是圈外,然后你决定放行、重定向还是直接 403。🚦

三、基础用法:静态资源防盗链(最常见场景)

示例一:简单白名单防盗链

location /static/ {
    valid_referers none blocked *.lanyicdn.com *.example.com;
    if ($invalid_referer) {
        return 403;
    }
}

配置逐行解释

  1. location /static/ { ... }

    • 作用:只对 /static/ 下的静态资源(图片、JS、CSS 等)启用规则,避免误伤 API 接口。
    • 你也可以改成 /images//assets/,按你的目录规划来。
  2. valid_referers none blocked *.lanyicdn.com *.example.com;

    • <span style="color:red">valid_referers</span>:定义合法来源列表。
    • none:允许没有 Referer 的请求(比如用户直接在浏览器地址栏敲静态资源地址、小程序请求等)。
    • blocked:允许头部被中间设备“遮蔽”的情况(Referer 格式异常时会识别为 blocked)。
    • *.lanyicdn.com:允许从你蓝易云 CDN 业务域名下所有子域发起的请求,比如 www.lanyicdn.comimg.lanyicdn.com
    • *.example.com:允许你的业务源站或主站域名。
      → 这一行的本质是:<span style="color:red">白名单模式</span>,列出你信任的上游页面域名。
  3. if ($invalid_referer) { return 403; }

    • $invalid_referer

      • 0:在白名单内(合法)。
      • 1:不在白名单内(非法来源,疑似盗链或直接构造)。
    • if ($invalid_referer):表示“如果是非法来源”。
    • return 403;:直接返回 403 禁止访问,既节省带宽,又给对方一个明确的拒绝。
      → 在蓝易云场景可以替换成跳转到一个提示页面,减缓用户抱怨。

四、进阶玩法:用 map 做更灵活的控制

在复杂架构里(多业务域、多 CDN 域名、多源站),直接在 location 里写 valid_referers 会越写越乱。更干净的方式是用 <span style="color:red">map</span> 预处理 Referer。

示例二:map + 变量控制防盗链

map $http_referer $referer_ok {
    default                           0;
    "~*://(www\.)?lanyicdn\.com"      1;
    "~*://(img\.)?lanyicdn\.com"      1;
    "~*://(www\.)?example\.com"       1;
}

server {
    location /static/ {
        if ($referer_ok = 0) {
            return 403;
        }
        # 其他缓存、压缩配置...
    }
}

配置逐行解释

  1. map $http_referer $referer_ok { ... }

    • 含义:根据请求头的 <span style="color:red">$http_referer</span>,计算出一个新变量 <span style="color:red">$referer_ok</span>
    • 优点:

      • 规则集中管理。
      • 能写更复杂的正则匹配。
      • 后续 server / location 都能复用这一个判定结果。
  2. default 0;

    • 没匹配到任何规则 → 默认标记为 0 = 不合法。
    • 等价于“黑名单世界中的默认拒绝”。
  3. "~*://(www\.)?lanyicdn\.com" 1; 等几行

    • ~*:大小写不敏感正则。
    • ://(www\.)?lanyicdn\.com:匹配从 http://https:// 打开的页面,域名为 lanyicdn.comwww.lanyicdn.com
    • 右侧 1:只要命中,$referer_ok 就置为 1,表示合法。
    • 多行规则可以涵盖不同业务子域或第三方业务入口。
  4. if ($referer_ok = 0) { return 403; }

    • 一句判断,业务逻辑非常清晰:
    • <span style="color:red">referer_ok = 0 → 直接拒绝</span>,其他情况放行。
    • 将来要做灰度调试(比如只记录日志不拦截),只要把 return 403 换成 access_log 即可,扩展性很好 🚀

五、蓝易云 CDN 场景下的实战建议

  1. 源站 Nginx 防盗链只针对 <span style="color:red">大流量静态资源目录</span>,不要对 API、回源健康检查乱加 referer 限制。
  2. CDN 节点和源站之间,尽量保持 Referer 透传;如果有自建前置网关,可以统一改成某个内部域名方便区分。
  3. 对于“不带 Referer 的合法请求”(APP、小程序、命令行工具):

    • 源站规则记得加 none,否则你自己把自己打挂。
    • 重要接口建议额外叠加 <span style="color:red">签名参数 / Token / 鉴权网关</span>,不要单靠 Referer。
  4. 高并发场景下,如果白名单域名非常多,观察 Nginx 报警:

    • 如果提示 hash bucket/size 相关告警,再考虑适度调大 referer_hash_max_sizereferer_hash_bucket_size,而不是一上来就乱调。

六、Referer 防盗链整体工作流程(Markdown 原理表)

| 步骤 | 环节                         | 关键变量/指令                        | 说明与建议 |
| ---- | ---------------------------- | ------------------------------------ | ---------- |
| 1    | 用户发起请求                 | 浏览器写入 Referer                   | 页面 → 静态资源时自动附带,APP/爬虫可能为空 |
| 2    | 蓝易云 CDN 接收请求          | $http_referer                        | 默认透传到源站,如需自定义再在 CDN 层改写 |
| 3    | 源站 Nginx 匹配 location     | location /static/                    | 仅在静态目录启用 referer 策略,避免误伤接口 |
| 4    | 计算合法性                   | valid_referers / map + $referer_ok   | 统一判定来源是否在白名单范围内 🔍 |
| 5    | 做出决策                     | if ($invalid_referer) / if ($referer_ok=0) | 403 / 跳转 / 仅记录日志,按业务需求选择 |
| 6    | 辅助安全                     | 鉴权、签名 URL、IP 限制等            | Referer 只是一环,重要资源必须叠加其它安全手段 🔒 |

这个表可以直接丢进 Vditor 或任意支持 Markdown 的编辑器里使用。


七、实话实说:referer 能做什么,不能做什么

  • 能做的:

    • 快速挡住大部分“右键复制链接”“外站直接引用图片”的低成本盗链。
    • 初步筛掉一部分明显异常来源,为蓝易云的风控、监控打基础。
    • 配合日志分析,帮助你看清真实流量来源结构。
  • 不能做的:

    • 无法抵御有意识的伪造请求(Referer 随便写一个白名单域名就能绕过)。
    • 无法替代鉴权系统、签名 URL、请求限速等真正的安全策略。

所以在蓝易云 CDN 的架构里,更务实的做法是:

用 <span style="color:red">referer</span> 做“第一道便宜的栅栏”,再用 <span style="color:red">签名、防刷、限速、WAF</span> 做真正的安全闭环。

如果你把现在的 Nginx 配置贴出来,我可以帮你按“蓝易云标准化模板”的方式,直接重构成一份可上线的 referer 防盗链方案 💡


蓝易云
39 声望7 粉丝

蓝易云高防服务器:www.tsyvps.com