Nginx防盗链需在静态资源location中用valid_referers校验Referer,配合$invalid_referer return 403拦截;白名单须包含none、blocked、server_names及合作域名;禁用location /全局配置,推荐正则匹配后缀或精准路径。

在 Nginx 中配置防盗链,核心是利用 valid_referers 指令校验请求头中的 Referer 字段,并结合 $invalid_referer 变量拦截非法来源。它不防伪造,但能有效阻止绝大多数懒盗链行为。
只在静态资源 location 中配置
防盗链逻辑必须限定在匹配真实资源的 location 块内,不能写在 http 或根 location / 下,否则会误拦 HTML、JS、API 等关键请求。
- 推荐用正则精准匹配后缀:
location ~* \.(jpg|jpeg|png|gif|webp|svg|ico|woff2?|ttf|eot|mp4|pdf)$ - 若只保护
/img/目录,直接写:location /img/,再配合root或alias - 避免使用
location /全局拦截,否则首页、CSS、JS 都可能加载失败
设置合理的 Referer 白名单
valid_referers 必须包含真实访问场景,否则用户从书签、微信内嵌页、PWA 离线页等访问时会失败。
-
none:允许空 Referer(如地址栏直输、收藏夹点击) -
blocked:允许被代理或浏览器扩展清空后的 Referer(如值为localhost或about:blank) -
server_names:自动匹配当前server_name所有域名(含 www 和非 www) -
*.example.com:允许所有子域名(注意星号需转义为~\.example\.com$更安全) -
https://partner.com:显式添加合作方域名,多个用空格分隔
拦截方式建议用 return 403
返回 403 是最清晰、日志最易排查的方式。相比 rewrite 或跳转,它不会污染状态码、不丢失原始参数、不引发隐式循环。
- 简单可靠:
if ($invalid_referer) { return 403; } - 若想让用户看到提示图,用
error_page更稳妥:error_page 403 =200 /static/forbidden.png; - 避免
rewrite ^/ ... break:该方式会丢弃查询参数,且默认图若在同一 location 下可能触发二次匹配
验证与注意事项
配置后务必测试空 Referer、合法域名、非法域名三种情况,尤其注意移动端 WebView 和企业内网环境。
- 用
curl -e "https://baidu.com" https://yoursite.com/test.jpg模拟盗链请求 - 用
curl -H "Referer:" https://yoursite.com/test.jpg测试空 Referer 是否放行 - Nginx 不校验 HTTPS 协议差异,
http://example.com和https://example.com视为不同域名,白名单需都写上 - 该方案仅防懒盗链;如需防伪造,得启用
secure_link模块并配合 URL 签名


















