在蓝易云 CDN 这类多节点架构里,合理利用 Nginx 的 <span style="color:red">referer</span> 能把防盗链、流量治理和来源统计捏在一起做好。下面我直接拆开讲原理 + 配置方法 + 注意事项,尽量说人话,但技术细节一个都不落下 🙂
一、referer 的本质:浏览器带来的“来源线索”
- 浏览器在发起请求时,会把当前页面地址写进 HTTP 头部
<span style="color:red">Referer</span>字段。 - Nginx 会把这个头映射成变量:<span style="color:red">$http_referer</span>,供后续指令判断。
在 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 中,主要就三件事:
<span style="color:red">valid_referers</span>:定义什么是“合法来源”。<span style="color:red">$invalid_referer</span>:自动标记当前请求是否是非法来源(1 = 非法,0 = 合法)。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;
}
}配置逐行解释
location /static/ { ... }- 作用:只对
/static/下的静态资源(图片、JS、CSS 等)启用规则,避免误伤 API 接口。 - 你也可以改成
/images/、/assets/,按你的目录规划来。
- 作用:只对
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.com、img.lanyicdn.com。*.example.com:允许你的业务源站或主站域名。
→ 这一行的本质是:<span style="color:red">白名单模式</span>,列出你信任的上游页面域名。
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;
}
# 其他缓存、压缩配置...
}
}配置逐行解释
map $http_referer $referer_ok { ... }- 含义:根据请求头的
<span style="color:red">$http_referer</span>,计算出一个新变量<span style="color:red">$referer_ok</span>。 优点:
- 规则集中管理。
- 能写更复杂的正则匹配。
- 后续
server/location都能复用这一个判定结果。
- 含义:根据请求头的
default 0;- 没匹配到任何规则 → 默认标记为 0 = 不合法。
- 等价于“黑名单世界中的默认拒绝”。
"~*://(www\.)?lanyicdn\.com" 1;等几行~*:大小写不敏感正则。://(www\.)?lanyicdn\.com:匹配从http://、https://打开的页面,域名为lanyicdn.com或www.lanyicdn.com。- 右侧
1:只要命中,$referer_ok就置为 1,表示合法。 - 多行规则可以涵盖不同业务子域或第三方业务入口。
if ($referer_ok = 0) { return 403; }- 一句判断,业务逻辑非常清晰:
- <span style="color:red">referer_ok = 0 → 直接拒绝</span>,其他情况放行。
- 将来要做灰度调试(比如只记录日志不拦截),只要把
return 403换成access_log即可,扩展性很好 🚀
五、蓝易云 CDN 场景下的实战建议
- 源站 Nginx 防盗链只针对 <span style="color:red">大流量静态资源目录</span>,不要对 API、回源健康检查乱加 referer 限制。
- CDN 节点和源站之间,尽量保持 Referer 透传;如果有自建前置网关,可以统一改成某个内部域名方便区分。
对于“不带 Referer 的合法请求”(APP、小程序、命令行工具):
- 源站规则记得加
none,否则你自己把自己打挂。 - 重要接口建议额外叠加 <span style="color:red">签名参数 / Token / 鉴权网关</span>,不要单靠 Referer。
- 源站规则记得加
高并发场景下,如果白名单域名非常多,观察 Nginx 报警:
- 如果提示 hash bucket/size 相关告警,再考虑适度调大
referer_hash_max_size、referer_hash_bucket_size,而不是一上来就乱调。
- 如果提示 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 防盗链方案 💡
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。