Nginx静态资源防盗链核心是valid_referers配合if($invalid_referer)返回403;需置于静态资源location块内,白名单含none、blocked及显式域名,禁用rewrite跳转,搭配expires缓存。

Linux 下 Nginx 生产环境静态资源防盗链,核心就一条:用 valid_referers 锁定资源路径 + if ($invalid_referer) 拦截,返回 403 最稳妥。它不防伪造,但能挡住 95% 的懒盗链和白嫖流量,且原生支持、无需编译、零额外依赖。
精准匹配资源路径,别写在 http 或 server 顶层
valid_referers 只在 server 或 location 块内生效。写在 http{} 里完全无效,Nginx 不报错也不拦截——这是最常见误配。
- 必须放在专门匹配静态资源的 location 中,例如:
location ~* \.(jpg|jpeg|png|gif|webp|svg|mp4|pdf|zip)$ - 避免笼统写
location /—— 那会把防盗链逻辑套到所有请求上,连 API 和 HTML 都可能被误拦 - 若站点有多个域名(如 example.com 和 www.example.com),需在
valid_referers中显式列出两者,或统一用*.example.com覆盖子域
白名单必须包含 none 和 blocked
none 对应直接访问(浏览器地址栏输 URL、收藏夹点击、微信内嵌 WebView 打开);blocked 对应 Referer 被企业网关、安全插件或某些安卓 WebView 清空的情况。漏掉它们,会导致大量真实用户看到 403。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 正确写法:
valid_referers none blocked example.com *.example.com; - 错误写法:
valid_referers example.com;(直接屏蔽所有直接访问和内网调试) - 不要加
http://或结尾斜杠——Nginx 匹配的是 Referer 字符串本身,example.com和www.example.com是两个独立项
返回 403,别用 rewrite 跳默认图
用 return 403 语义清晰、日志可查、无副作用。而 rewrite ^/ /forbidden.jpg break; 会丢失原始查询参数(如 ?v=2)、返回 200 状态码、还可能触发 location 循环匹配。
- 若真要展示提示图,用
error_page 403 =200 /static/forbidden.png;,既保持拦截语义,又让客户端看到图片 - 确保该提示图路径不在同一防盗链 location 内,或单独用精确匹配
location = /static/forbidden.png { }排除 - 搭配
expires 7d;缓存头,减少重复拦截带来的小开销
生产环境额外加固建议
防盗链只是基础一层。上线前还需确认几件事:
- 执行
nginx -t测试语法,再systemctl reload nginx,避免全站中断 - 隐藏 Nginx 版本号:
server_tokens off;放在http块中,防止暴露已知漏洞版本 - 运行用户降权:
user nginx nginx;(提前创建 nginx 用户并禁用登录) - 如需防伪造或有时效控制(如限时下载链接),secure_link 模块是唯一正解,但需确认 Nginx 编译时启用了
--with-http_secure_link_module;Ubuntu/Debian 官方包默认不带,不可强求

















