nginx防盗链保护js文件需谨慎配置:仅对业务关键js和外引公共js启用valid_referers限制,避免误拦内联或动态加载脚本;location中匹配.js$并放行none、blocked及自有域名,同时绕过cdn回源、spa跳转、本地开发等场景,必要时叠加token或签名验证。

Nginx 防盗链保护 JS 文件,核心是通过 valid_referers 限制 Referer,再用 if 判断并返回 403。但要注意:JS 文件常被页面内联或动态加载,Referer 可能为空或不可靠,直接粗暴拦截容易导致自己站点 JS 加载失败。
明确哪些 JS 需要保护
不是所有 JS 都该防盗链。优先保护:
- 业务关键 JS(如支付 SDK、加密逻辑、授权校验脚本)
- 放在静态资源目录下、被外站直接引用的公共 JS(如
/js/widget.js) - 不希望被爬虫或第三方页面 script 标签引入的工具类文件
避免对 /node_modules/、构建产物中带哈希的 JS(如 main.a1b2c3.js)做 Referer 限制——它们通常不直对外提供,且现代构建工具已默认处理路径隔离。
基础防盗链配置(推荐写在 location 块中)
以保护 /js/ 下所有 .js 文件为例:
location ~* \.js$ {
valid_referers none blocked server_names *.yourdomain.com yourdomain.com;
if ($invalid_referer) {
return 403;
}
}
说明:
-
none:允许空 Referer(比如用户直接访问 JS 地址、或某些浏览器隐私模式) -
blocked:允许 Referer 被防火墙/代理过滤后只剩协议域名(无 path)的情况 -
*.yourdomain.com yourdomain.com:只放行你自己的域名(含子域) - 正则
\.js$匹配结尾为 .js 的请求,不匹配.min.js或.map——如需一并保护,改用\.js[^\?]*$或单独加规则
绕过常见误伤场景
以下情况 JS 会因 Referer 丢失被误拦,需针对性放行:
-
前端 SPA 路由跳转:单页应用内导航时,部分浏览器可能不带 Referer → 在
valid_referers中保留none -
CDN 回源请求:CDN 节点回源时 Referer 可能被清除 → 加上 CDN 的 User-Agent 或 IP 段白名单(用
map+if判断更稳妥) -
本地开发或测试环境:允许
localhost和127.0.0.1→ 补充~*^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$到 valid_referers(注意 Nginx 1.17+ 才支持正则域名)
增强方案:结合 UA 或 Token(可选)
纯 Referer 易伪造,高敏感 JS 可叠加验证:
- 要求请求带特定 Header:
if ($http_x_js_token != "abc123") { return 403; } - 配合前端动态生成带签名的 JS URL(如
/js/app.js?t=123&sign=xxx),Nginx 用map+secure_link模块校验 - 对 JS 接口类资源(如
/api/sdk.js),改用后端动态生成并校验 Referer + Token,比纯静态防盗更可靠
不复杂但容易忽略:上线前务必用 curl 模拟不同 Referer 测试,同时打开浏览器开发者工具看 Sources 面板确认自己页面的 JS 是否正常加载。










