cdn边缘节点与nginx源站防盗链须分层设计:边缘仅校验可信ip段和host头,禁用referer过滤;源站必须验证可信ip、预设host及动态签名头(如x-cdn-sign),原始referer仅由cdn注入x-original-referer供统计,不作准入依据。

CDN 加速节点和 Nginx 源站的防盗链必须分层设计、各司其职,不能简单复用同一套 Referer 规则。核心原则是:边缘节点做“粗筛”,源站做“精验”;边缘防误放,源站防绕过。
边缘节点只校验可信回源身份,不依赖 Referer
CDN 节点发起的回源请求,本质是服务端对服务端的调用,不是浏览器行为。因此:
- 禁止在边缘节点用
$http_referer判断是否放行回源请求——攻击者可伪造任意 Referer 直接打源站 - 应严格限制回源 IP 段(如 Cloudflare 的
173.245.48.0/20、阿里云 CDN 回源段),配合 Host 头校验(如只允许origin.yoursite.com) - 更优方案是要求 CDN 在回源时携带签名头(如
X-Cdn-Sign: hmac-sha256=xxx),边缘节点生成,源站用共享密钥验证
源站不信任任何客户端字段,只认可控凭证
源站收到的请求,可能是来自 CDN、爬虫、或被绕过的直连攻击。所以:
- 拒绝仅靠
$http_referer做白名单(例如valid_referers none blocked example.com;)——该配置在 CDN 场景下极易失效或误拦 - 源站必须校验:真实回源 IP 是否在可信段内 + Host 是否为预设回源域名 + 是否存在有效签名头且验签通过
- 若业务需记录原始来源(如统计跳转页),应由 CDN 主动注入
X-Original-Referer头,源站用map做辅助白名单,但不作为准入依据
缓存与防盗链策略必须协同,避免状态错位
CDN 和 Nginx 缓存层如果各自独立判断,会导致缓存污染或策略失效:
- 确保 CDN 缓存键(Cache-Key)中包含用于防盗链决策的关键字段,例如
Host和X-Cdn-Sign(如有),否则带签名的合法请求可能命中无签名的缓存副本 - Nginx 源站开启
proxy_cache_use_stale时,需排除http_403,防止错误拦截状态被缓存并返回给后续用户 - 建议在响应头中统一添加
X-Cache-Status和X-Protected-By,便于快速定位是哪一层拦截了请求
典型错误配置及后果
以下做法会实质性削弱防护能力:
- 在源站 location 中写
if ($invalid_referer) { return 403; },且未加 IP/Host/签名校验——攻击者构造Referer: https://yoursite.com即可绕过 - CDN 配置了 Referer 白名单,但源站未限制回源 IP——攻击者模拟 CDN 请求头直连源站,完全跳过 CDN 防盗链
- 源站缓存了 403 响应(例如因签名过期返回的拦截),导致后续合法请求也收到 403











