nginx为图片cdn构建防盗链白名单需多维校验:优先用cdn回源ip白名单(set_real_ip_from + allow/deny),辅以自定义header(如x-cdn-source)或可信user-agent校验;同时保留valid_referers none blocked your-domain.com *.your-domain.com支持浏览器直连;通过geo/map分层路由,区分cdn回源与普通请求,避免误拒并增强安全性。

要在 Nginx 中为图片 CDN 加速节点构建安全的防盗链白名单校验体系,关键不是单纯拦截“非我域名”的请求,而是精准识别并放行合法 CDN 节点的回源请求——因为 CDN 边缘节点访问你源站时,Referer 通常是你自己的域名(或为空),但更常见的是:CDN 回源请求压根不带 Referer,或携带的是 CDN 自身的内部标识(如特定 User-Agent、自定义 Header 或固定 IP 段)。所以仅靠 valid_referers 检查 Referer 是不够的,必须结合多维度校验。
识别并信任 CDN 回源流量
主流 CDN(如 Cloudflare、阿里云 CDN、腾讯云 CDN、又拍云、七牛)在回源时会提供可验证的身份凭证。优先采用以下方式之一确认回源合法性:
-
IP 白名单:各 CDN 厂商均公开其回源 IP 段(如阿里云 CDN 回源 IP 列表每月更新,需定期同步)。在 Nginx 中用
set_real_ip_from+real_ip_header配合allow/deny控制访问权限,是最可靠的方式; -
自定义 Header 校验:多数 CDN 支持配置回源 Header(如
X-Cdn-Source: aliyun或X-Forwarded-For的可信链)。可在 location 中用if ($http_x_cdn_source != "aliyun") { return 403; }进行强校验; -
User-Agent 匹配:部分 CDN 回源请求带有固定 UA(如
AliYunTest、QiniuClient),可用map指令预定义可信 UA 并配合$invalid_referer逻辑复用;
兼顾浏览器直连与合法 Referer 的白名单策略
除 CDN 回源外,还需允许真实用户通过你自身站点访问图片(如页面内 <img src="...">),以及直接输入 URL 访问(Referer 为空):
- 在图片 location 块中使用
valid_referers none blocked your-domain.com *.your-domain.com;; -
none允许地址栏直接打开、微信/QQ 内置浏览器等无 Referer 场景; -
blocked允许被代理/防火墙剥离 Referer 后仍能访问(避免误杀); - 域名白名单建议用精确匹配(
your-domain.com)+ 通配二级(*.your-domain.com),避免*.com类宽泛写法引发安全风险;
分层校验:CDN 回源与普通请求走不同路径
推荐将 CDN 回源请求和用户浏览器请求分离处理,提升可维护性与安全性:
- 用
geo或map指令根据来源 IP 或 Header 标记一个变量(如$is_cdn_origin); - 在图片 location 中先判断
if ($is_cdn_origin) { ... },满足则跳过 Referer 检查,直接放行并启用长缓存(expires 1y); - 否则执行标准
valid_referers+$invalid_referer流程,返回 403 或重定向到提示图; - 这样既避免 CDN 请求被 Referer 规则误拒,也防止攻击者伪造 CDN Header 绕过(因 IP 或 Header 双校验才放行);
配套加固与可观测性
白名单本身不是终点,需配套机制确保实效性与可审计性:
- 所有防盗链拦截日志应记录
$remote_addr、$http_referer、$http_user_agent、$http_x_cdn_source等字段,便于溯源异常请求; - 对返回 403 的请求,可添加响应头
Access-Control-Allow-Origin: *(若需跨域调试)或自定义X-Anti-Leech: Denied标识; - 定期轮询 CDN 官方 IP 列表并自动更新 Nginx 配置(建议用 Ansible 或脚本 + reload);
- 禁用
autoindex on和目录遍历,防止图片资源被枚举泄露;











