关键是将防盗链规则集中写在覆盖主流静态资源后缀的正则location块中,如location ~ .(jpg|jpeg|png|gif|webp|svg|css|js|woff2?|ttf|eot|mp4|avi|pdf|zip|rar)$,配合valid_referers none blocked yourdomain.com .yourdomain.com白名单及if ($invalid_referer) { return 403; }拦截,并确保该location内有root或alias路径声明及try_files $uri =404;。

在 Nginx 中用 location 实现统一的静态资源防盗链,关键是把规则集中写在一个能覆盖所有目标资源的 location 块里,而不是为每种文件类型或路径重复配置。这样既减少冗余,又便于维护和验证。
选一个精准又通用的 location 匹配方式
推荐使用大小写不敏感的正则匹配,一次性覆盖主流静态资源后缀:
-
location ~* \.(jpg|jpeg|png|gif|webp|svg|css|js|woff2?|ttf|eot|mp4|avi|pdf|zip|rar)$—— 覆盖图片、样式、脚本、字体、视频、文档、压缩包等常见类型 - 避免用
location /或location ~ \.xxx$但漏掉大小写(比如只写.JPG),~*才真正忽略大小写 - 不要把防盗链逻辑放在
http或顶层server块——valid_referers 必须在能定位到文件的上下文中生效,否则无效
白名单必须兼顾真实访问场景
只写 yourdomain.com 很容易误拦合法请求。生产环境应包含:
-
none:放行地址栏直输、收藏夹打开、HTTPS→HTTP 跳转导致 Referer 清空的情况 -
blocked:兼容隐私插件、企业代理、WebView 等清空或篡改 Referer 的终端 -
yourdomain.com *.yourdomain.com:主域和子域都显式列出,*.yourdomain.com不包含主域本身 - 如有合作站点,可追加
partner-site.com;若 CDN 回源走私有 Header,需额外配合$http_x_forwarded_for或自定义变量处理
拦截动作要明确且安全
校验后必须主动响应,不能只定义白名单就结束:
- 标准做法:
if ($invalid_referer) { return 403; }—— 简洁、语义清晰、无副作用 - 如需友好提示,可返回一张公开可访问的图片:
if ($invalid_referer) { return 302 /img/forbidden.png; },注意该图片所在 location 不能启用防盗链,否则形成死循环 - 禁用
rewrite ... proxy_pass类组合操作——Nginx 官方明确不建议在 if 块中调用 proxy_pass,易引发不可预期行为
确保资源路径能真正命中文件
防盗链生效的前提是 Nginx 能读取到对应文件,所以该 location 内必须有路径声明:
- 如果静态资源统一放在
/var/www/static/,就加root /var/www;,然后靠 URI 自动拼接(如请求/a.jpg→ 查找/var/www/a.jpg) - 如果资源集中在子路径如
/static/下,推荐用alias /var/www/static/;,注意末尾斜杠必须匹配(alias值末尾有/,location 也得带/) - 务必加上
try_files $uri =404;,防止因路径错误返回空内容或内部重定向漏洞











