nginx 防盗链需适配 cdn 回源:信任 cdn 固定 referer(如 *.mycdn.com),关闭 cdn referer 透传,按 location 分离 cdn 与直连流量,并协同 cdn 层防盗链与签名 url 实现高效防护。

针对静态图片使用 CDN 的场景,Nginx 防盗链不能简单照搬“只允本站域名”的配置——否则 CDN 节点回源请求会被拦掉,导致 403 或 404,反而中断正常访问。核心思路是:让 CDN 的回源请求“看起来合法”,同时继续拦截真实盗链。
识别并信任 CDN 回源 Referer
主流 CDN(如 Cloudflare、阿里云 CDN、腾讯云 CDN、又拍云等)在回源时,默认会带上自身域名作为 Referer(例如 https://cdn.example.com 或 https://a123456789.cdnprovider.net),而非原始用户页面的 Referer。因此需把 CDN 域名显式加入白名单:
- 用
valid_referers添加 CDN 域名(支持通配符或正则):valid_referers none blocked *.mycdn.com ~\.cdn\-provider\.com$; - 若 CDN 支持自定义回源 Header,可要求其设置特定 Referer(如
X-Cdn-Request: true),再配合map提前判断,但多数 CDN 不开放此能力,优先走域名匹配 - 避免仅依赖 IP 白名单——CDN 节点 IP 动态变化,且可能与其他服务共用,不安全也不稳定
关闭 CDN 的 Referer 透传(推荐)
很多 CDN 默认开启“透传 Referer”,即把用户浏览器发起的原始 Referer(比如论坛页面地址)直接发给源站。这会导致:
- 你的 Nginx 看到的是第三方网站域名,误判为盗链
- 白名单必须加一堆合作/竞品域名,管理混乱且有风险
✅ 正确做法:在 CDN 后台关闭 Referer 透传,改用固定回源 Referer(如 https://your-site.cdn)或清空 Referer。这样源站 Nginx 只需信任该固定值,规则更简洁、性能更高。
按 location 分离 CDN 和直连流量
若业务同时支持 CDN 加速和用户直连(如内部系统、灰度环境),建议用不同路径或 Host 区分:
- CDN 流量走
/cdn-img/路径,配置宽松白名单:location ^~ /cdn-img/ { valid_referers none blocked *.mycdn.com; if ($invalid_referer) { return 403; } } - 直连图片走
/img/,启用严格限制(仅主站+子域+空 Referer):location ^~ /img/ { valid_referers none blocked *.example.com example.com; if ($invalid_referer) { return 403; } } - 避免用正则匹配全站图片(如
location ~* \.(jpg|png))混用策略,易引发误拦或漏防
配合 CDN 自身防盗链做协同防御
Nginx 层的 Referer 限制是基础防护,真正降低回源压力要靠 CDN 层拦截:
- 启用 CDN 的 Referer 黑/白名单功能(与 Nginx 规则保持一致),在边缘节点就拒绝非法请求,不发往源站
- 结合时间戳签名 URL(如
?Expires=1721552000&Signature=xxx),CDN 校验通过才回源,Nginx 可跳过 Referer 判断,大幅提升吞吐 - 对高频盗链来源(可通过 CDN 日志分析得出),在 CDN 入口层做 IP 限频或 UA 过滤,减少无效回源
不复杂但容易忽略:Nginx 的 Referer 防盗链只是第一道关卡,真正高性能的关键,在于让合法 CDN 请求畅通无阻,同时把绝大多数非法请求挡在 CDN 边缘。











