cdn防盗链需与nginx协同:cdn层优先做referer白名单和url签名验证,nginx源站兜底校验;缓存策略须联动,日志监控需覆盖cdn与nginx全链路。

在 CDN 加速架构中,Nginx 防盗链不能单独生效,必须与 CDN 层策略协同设计。CDN 作为用户请求的第一道入口,会先拦截或放行请求;若请求穿透 CDN 到达 Nginx 源站,才由 Nginx 执行二次校验。两者配合不当,容易导致防盗链失效、缓存污染或误拦截。
CDN 层优先做 Referer 白名单 + 签名验证
主流 CDN(如 Cloudflare、阿里云 CDN、腾讯云 CDN)均支持基于 Referer 的黑白名单和 URL 签名鉴权。这是最前置、最高效的防盗链手段:
- 配置 Referer 白名单:只允许你自己的域名(如 example.com、app.example.com)发起资源请求,屏蔽空 Referer 和非法来源
- 启用 URL 签名(Signed URL):对图片、视频等敏感静态资源,生成带过期时间与 HMAC 签名的链接(如
/img/logo.png?Expires=1730478000&Signature=xxx),CDN 边缘节点自动校验,无效签名直接 403 - 注意关闭 CDN 的“忽略源站 Cache-Control”选项,否则可能绕过 Nginx 设置的
no-cache或private头,影响签名逻辑执行
Nginx 源站做兜底与动态校验
CDN 不是万能的——它可能被绕过(如直接请求源站 IP)、不支持复杂逻辑,或需对接后端业务规则。此时 Nginx 要承担最终校验职责:
- 使用
secure_link模块校验签名参数($arg_md5、$arg_expires),配合secure_link_md5生成密钥摘要,确保 URL 无法被篡改或重放 - 对非签名资源(如公开 CSS/JS),用
valid_referers+if ($invalid_referer)返回 403,但需注意:该方式易被伪造 Referer,仅作辅助 - 结合后端 Java/PHP 动态生成临时 Token:Nginx 通过
auth_request指令将请求转发至鉴权接口(如/auth/check),由业务逻辑判断当前用户是否有权访问该资源路径
缓存策略必须与防盗链联动
防盗链失效常源于缓存错乱——比如一个被拒绝的盗链请求被 CDN 缓存为 403,后续合法请求也返回 403;或签名资源被长期缓存,过期后仍可访问。
- 对签名资源(如
*.(jpg|png|mp4)),设置Cache-Control: private, no-store或极短缓存(max-age=30),避免 CDN 缓存鉴权结果 - 对白名单 Referer 资源,可设较长缓存(如
public, max-age=31536000),但需配合版本化路径(/v2.3.1/logo.png)或文件哈希命名,确保更新即失效 - Nginx 中用
proxy_ignore_headers Cache-Control Expires Set-Cookie谨慎控制是否透传源站头,防止 CDN 错误继承不安全缓存指令
日志与监控要覆盖全链路
仅看 Nginx 日志无法定位是 CDN 拦截还是源站拦截,需打通两级日志上下文:
- 在 CDN 后台开启「详细访问日志」,记录
Edge-Status(HIT/MISS/ERROR)、Origin-Status(回源响应码)、Referer和User-Agent - Nginx 日志中添加 CDN 传递的头信息,例如
$http_x_forwarded_for、$http_x_cache_status、$http_referer,便于关联分析 - 对高频 403 请求,按
Referer和请求 URI 聚类,快速识别是恶意爬虫、盗链站点,还是自身 CDN 配置错误











