Referer防盗链关键在于为每个域名单独配置合法Referer规则,覆盖自身及子域且不误拦其他域名;通配符需按域名分别定义,location块须精确匹配资源类型并明确root/alias路径。

多域名共用一套静态资源时,Referer 防盗链的关键不是“写对通配符”,而是让每个域名的合法 Referer 规则能准确覆盖它自己和它的子域,同时不误拦其他域名的请求。通配符本身很简单,但放错位置、混用规则或忽略 none/blocked 就会导致大量正常访问被拒。
通配符必须按域名分别定义,不能靠全局一条规则覆盖所有站
比如你有 site-a.com、site-b.net 和 admin.myapp.io 三个域名,都从同一台 Nginx 读取 /var/www/static 下的图片和 JS。不能在 http 块里写一条 valid_referers *.com *.net;——这会把所有 .com 域名都放行,包括盗链者。
正确做法是在每个 server 块里,针对自己的域名单独配置:
-
site-a.com 的 server 块:写
valid_referers none blocked site-a.com *.site-a.com; -
site-b.net 的 server 块:写
valid_referers none blocked site-b.net *.site-b.net; -
admin.myapp.io 的 server 块:写
valid_referers none blocked admin.myapp.io *.myapp.io;(注意:*.myapp.io 包含 admin.myapp.io,但不包含 myapp.io;如需主域也合法,得显式加上myapp.io)
location 块必须匹配资源类型,且 root/alias 要明确
防盗链逻辑只在真正处理静态文件的 location 中生效。如果把 valid_referers 写在 server 级别,Nginx 不知道该去哪找文件,$invalid_referer 判断就失去上下文。
推荐结构:
- 用
location ~* \.(jpg|png|js|css|woff2)$精确匹配静态资源后缀 - 这个 location 里必须有
root /var/www/static;或alias /var/www/static/;(二者选一,别混用) - 确保该 location 在对应 server 块内,而不是放在 http 或 upstream 里
通配符写法与常见陷阱
*.example.com 表示任意子域名(如 img.example.com、cdn.example.com),但不匹配 example.com 本身。所以白名单里要同时写 example.com 和 *.example.com。
几个易错点:
- 写成
*.com→ 会匹配evil.com、github.com,完全失效 - 漏掉
none→ 用户直接输入图片 URL 或从 HTTPS 页面跳转到 HTTP 资源时,Referer 为空,会被 403 拦截 - 漏掉
blocked→ 部分隐私浏览器插件或企业防火墙会清空 Referer,导致合法用户加载失败 - 多个域名用空格隔开,不是逗号:
valid_referers none blocked a.com *.a.com b.net *.b.net;(这是允许 a.com 及其子域、b.net 及其子域)
跨域名引用场景要额外处理
如果 A 域名的页面要引用 B 域名下的静态资源(比如 CDN 或微前端),那 B 的防盗链规则里就得把 A 的域名加进白名单,例如:
- B 域名(cdn.example.net)的 location 块中写:
valid_referers none blocked example.com *.example.com cdn.example.net; - 同时建议加
add_header Access-Control-Allow-Origin "https://example.com";,避免前端报 CORS 错误


















