cdn边缘节点负责校验用户原始referer并放行合法请求,源站nginx应忽略$http_referer,仅通过可信ip段、host头及cdn签名头验证回源身份,二者角色分离才能避免误拦或失效。

CDN 边缘节点与 Nginx 源站之间正确传递和校验 Referer 防盗链状态,关键不在于“透传原始 Referer”,而在于明确区分两个层级的校验角色:边缘层做用户侧来源过滤,源站层只信任 CDN 自身回源行为——二者不能混用同一套规则,否则必然失效或误拦。
边缘节点应完成面向终端用户的 Referer 校验
真实用户请求首先到达 CDN,此时应由 CDN 完成对 浏览器原始 Referer 的白名单校验(如是否来自 yoursite.com 或合作域名)。这是防盗链的第一道防线,也是最有效的一环。CDN 通常支持图形化配置或自定义规则,可直接设置:
- 允许的 Referer 域名(支持通配符、正则、空 Referer、blocked)
- 对不匹配请求返回 403 或重定向到默认图
- 对合法请求才向源站发起回源,且无需将原始 Referer 转发给源站
源站 Nginx 应忽略用户 Referer,只校验 CDN 回源身份
源站收到的请求全部来自 CDN 节点 IP,其 $http_referer 字段可能是:
- 被 CDN 清空(出于隐私或标准化策略)
- 被 CDN 设置为自身域名(如 cdn.yoursite.com)
- 被恶意伪造(若 CDN 未做防护)
因此,源站绝不应再基于 $http_referer 做用户来源判断**。正确做法是:
- 在 Nginx 中用 map + $remote_addr 识别可信 CDN 回源 IP 段(如 Cloudflare 的 173.245.48.0/20)
- 配合 Host 头校验(如只允许 cdn.yoursite.com 或 origin.yoursite.com)
- 如有 CDN 提供签名头(如 X-Cdn-Sign),务必在源站做密钥验签,而非依赖 Referer
若必须让源站感知原始来源,需通过 CDN 显式注入头
某些业务需要源站记录原始 Referer(如统计、灰度),这时不能依赖自动透传,而应由 CDN 主动注入一个自定义头,例如:
- CDN 在回源时添加 X-Original-Referer: https://a.com/page.html
- Nginx 源站中用 map $http_x_original_referer $is_valid_origin 做白名单校验(注意:该头仍可被绕过,仅作辅助)
- 同时保留 IP + Host + 签名头等硬性校验,不降低安全水位
常见错误配置及后果
以下做法会导致防盗链形同虚设或大面积误拦:
- 在源站 location 中写 valid_referers none blocked yoursite.com —— 此时 $http_referer 是 CDN 域名或为空,永远不匹配
- 开启 CDN 的 “透传 Referer” 但未同步更新源站白名单 —— 白名单仍按用户域名配,而实际收到的是 CDN 域名
- HTTPS 页面引用 HTTP 资源,浏览器清 Referer,CDN 又未显式补全 —— 合法流量被拦











