nginx静态资源防盗链首选valid_referers配合$invalid_referer实现referer白名单校验,配置于location块中,匹配失败返回403;增强方案可用secure_link模块签名验证。

Nginx 设置静态资源防盗链,核心是控制谁可以合法引用你的图片、CSS、JS、视频等文件。最常用且开箱即用的方式是 valid_referers 指令配合 $invalid_referer 变量做判断,适合大多数基础防护场景。
用 valid_referers 做 Referer 白名单校验
它通过检查请求头中的 Referer 字段,决定是否放行。匹配成功时 $invalid_referer 为空字符串,不匹配则为 "1"。
- 把配置写在能匹配到静态资源的
location块里(比如location ^~ /static/或location ~* \.(jpg|png|js|css)$) - 白名单支持多种写法:
none(允许直接访问)、blocked(允许被代理清空 referer 的请求)、example.com(精确域名)、*.example.com(子域名通配)、~\.baidu\.(正则匹配) - 多个规则是“或”关系,满足任一即视为合法
- 不要放在
http或upstream块中——它只在server或location内生效
配合 if 和 return 实现拦截
校验后需明确响应动作。推荐直接返回标准 HTTP 状态码:
-
if ($invalid_referer) { return 403; }—— 语义清晰,日志易识别,CDN 和爬虫能正确理解被拒绝 - 避免用
rewrite跳转到提示图,否则状态码仍是 200,掩盖盗链行为,还可能因参数丢失或循环匹配出错 - 如需返回友好提示图,改用
error_page 403 =200 /static/forbidden.png;,既保持 403 语义,又展示自定义内容
补充增强:加一层签名防盗链(更安全)
Referer 可被伪造,仅靠它防不住恶意调用。需要更高安全性时,可启用 secure_link 模块:
- 确认 Nginx 已编译含
--with-http_secure_link_module(主流发行版通常默认支持) - URL 中携带
?token=xxx&expires=1717027200,Nginx 校验 MD5 签名是否匹配secret_key + $uri + expires - 令牌生成必须严格一致:URI 不带查询参数、不自动解码;时间戳为 Unix 秒级整数
- 适合保护下载包、会员图片、限时预览视频等需强时效与路径绑定的资源
注意事项与常见坑
实际配置中容易忽略的关键点:
-
root或alias必须出现在同一location块内,否则 Nginx 找不到文件,防盗链逻辑就失去意义 -
example.com和www.example.com是两个不同字符串,白名单要都写上 - HTTPS 页面加载 HTTP 资源会因安全策略丢失 referer,此时
blocked能覆盖这类情况 - 移动端 App、微信内嵌页等可能不发 referer,按业务决定是否允许
none











