防盗链关键在于将valid_referers与root/alias置于同一location块中,确保路径匹配精准;valid_referers仅设置$invalid_referer变量,需配合if使用;推荐前缀匹配如location ^~ /static/,root与alias选择取决于URL与磁盘路径是否一致。

配置静态页面防盗链,关键不是选 root 还是 alias,而是把 valid_referers 和路径映射指令放在同一个 location 块里,并确保该 location 能精准匹配到你要保护的资源。
防盗链必须和路径映射写在同一个 location 里
valid_referers 不会自动生效,它只设置内置变量 $invalid_referer;这个变量只有在同级 location 中配合 if 才能起作用。如果 root/alias 写在别处(比如 server 块),Nginx 就不知道该去哪找文件,防盗链逻辑就断了。
- 正确写法:location 匹配资源 → 里面写 alias 或 root → 再写 valid_referers + if 判断
- 错误写法:server 级写 root,location 里只写 valid_referers —— 没有路径上下文,$uri 解析失败,可能返回 404 或绕过校验
- 推荐用前缀匹配,比如
location ^~ /static/,避免正则 location 优先级干扰
root 和 alias 在防盗链中怎么选
两者都能用,区别在于路径拼接逻辑,影响的是你如何组织目录结构,不影响防盗链本身是否生效。
- 用
root:适合 URL 路径和磁盘路径一致。例如location /static/ { root /var/www; }→ 请求/static/css/app.css对应/var/www/static/css/app.css - 用
alias:适合 URL 和磁盘路径不一致。例如location /cdn/ { alias /srv/assets/; }→ 请求/cdn/logo.png对应/srv/assets/logo.png(注意 alias 后必须带斜杠) - 无论选哪个,防盗链规则都加在同一 location 内,写法完全一样
一个可直接上线的防盗链配置示例
以下配置保护所有图片、JS、CSS 文件,只允许本站域名、子域名及空 referer(如直接输入地址)访问:
location ~* \.(jpg|jpeg|gif|png|css|js|woff2?|ttf|eot)$ {
alias /var/www/assets/;
valid_referers none blocked yoursite.com *.yoursite.com;
if ($invalid_referer) {
return 403;
}
}-
~*表示忽略大小写正则匹配,覆盖常见静态资源后缀 -
none允许用户直接在浏览器输入 URL 访问(无 Referer) -
blocked允许被代理或 HTTPS 页面引用 HTTP 资源时丢失 Referer 的情况 - return 403 是最简拦截方式;也可用 rewrite 跳转到提示图,但需确保提示图本身不被防盗链限制
容易踩坑的细节
防盗链看似简单,但几个细节没处理好就会失效或误杀:
- 空 Referer 很常见:HTTPS 页面加载 HTTP 资源会被浏览器主动清空 Referer,务必加
none或blocked - 多个 valid_referers 规则是“或”关系,不是“且”——满足任一即放行
- if 块不能和 proxy_pass 共存;但用于静态资源(alias/root)完全安全
- location 匹配要足够窄:别用
location /套整个防盗链,否则可能误拦 API 或登录页


















