nginx下载目录防盗链需在对应location块内配置valid_referers白名单(含none、blocked、server_names及域名通配),再通过if($invalid_referer){return 403;}拦截非法referer,且必须配合alias/root正确定义路径、禁用公共缓存以防绕过。

<p>在 Nginx 中限制下载目录的盗链访问,核心是结合 <code>valid_referers</code> 指令与 <code>location</code> 块精准匹配下载路径,并配合 <code>if</code> 判断 Referer。不能只靠全局防盗链,必须把规则写在具体下载目录(如 <code>/download/</code> 或 <code>/files/</code>)的 location 里。</p> <h3>1. 定义下载目录的 location 块</h3> <p>先明确你要保护的下载路径,比如所有文件放在 <code>/var/www/html/download/</code>,对应 URL 是 <code>/download/xxx.zip</code>。这时需单独配置该路径:</p>
- 用
location ^~ /download/精确匹配前缀,避免被其他正则覆盖 - 确保该 location 内不继承可能绕过防盗链的通用配置(如 root 或 alias 要写对)
- 推荐显式指定
alias或root,例如:alias /var/www/html/download/;(注意末尾斜杠)
2. 在 location 内配置 referer 白名单
防盗链逻辑必须放在这个 location 块内部,否则不生效:
- 用
valid_referers列出允许访问的来源,例如:valid_referers none blocked server_names *.example.com example.com; -
none允许空 Referer(比如直接输入 URL 下载)blocked拦截伪造 Referer(如经过代理或跳转丢失) -
server_names后跟你的域名,支持通配符*,但不支持路径或参数
3. 使用 if 判断并拒绝非法请求
紧接着 valid_referers,用 if 检查 $invalid_referer 变量:
-
if ($invalid_referer) { return 403; }最常用且有效 - 不要用
rewrite跳转或返回图片——对下载请求无效,用户只会看到 403 或连接中断 - 避免在 if 中做复杂操作(如 set、proxy_pass),Nginx 官方不推荐
4. 注意静态文件类型和缓存干扰
下载目录常含 zip、exe、pdf 等,要防止浏览器或 CDN 缓存绕过检查:
- 确认这些文件由 Nginx 直接提供(非后端代理),否则防盗链逻辑不执行
- 如果用了
add_header控制缓存,建议对下载路径禁用 public 缓存:add_header Cache-Control "no-store, no-cache, must-revalidate"; - 测试时用 curl 模拟不同 Referer:
curl -H "Referer: https://evil.com" http://yoursite/download/test.zip应返回 403
不复杂但容易忽略的是 location 范围和变量作用域——valid_referers 的作用域仅限当前 block,if 也只在此 location 内生效。写错位置,防盗链就形同虚设。











