nginx静态文件防盗链白名单需在精准匹配的location块中用valid_referers定义合法来源(none/blocked/域名/通配/正则),配合root或alias指定路径,并用$invalid_referer判断后return 403。

在 Nginx 中配置静态文件防盗链白名单,核心是用 valid_referers 指令定义合法来源,并配合 $invalid_referer 变量做判断。它不单独起作用,必须放在能精准匹配静态资源的 location 块里,且需搭配 root 或 alias 确保文件可访问。
白名单支持的合法来源类型
valid_referers 的参数是“或”关系,满足任一即放行。常用写法包括:
- none:允许无 Referer 的请求,比如用户直接在浏览器地址栏输入图片 URL、点击收藏夹、PWA 离线加载、微信内嵌浏览器打开等场景
-
blocked:允许 Referer 被清空或截断的请求,常见于 HTTPS 页面加载 HTTP 资源、企业防火墙/代理/隐私浏览器(如值为
about:blank或localhost) -
精确域名:如
example.com、www.example.com—— 注意两者不同,需同时列出 -
通配子域:如
*.example.com,匹配cdn.example.com、img.example.com -
正则匹配:如
~\.google\.或~\.baidu\.(com|cn)$,用于放行主流搜索引擎爬虫
必须写在正确的 location 块中
防盗链逻辑不能放在 http 或 server 根层级,只在 server 或 location 内生效。推荐两种匹配方式:
- 按路径前缀:如
location ^~ /static/ { ... },适合资源统一存放在/static/下 - 按文件后缀:如
location ~* \.(jpg|png|js|css|webp|svg|gif)$ { ... },适合分散存储但类型明确的资源
注意:不要用 location /images/ 后再靠内部路径判断——容易漏掉根目录图片或 CDN 回源请求。
搭配 root 或 alias 并返回明确响应
仅写 valid_referers 不够,必须在同一 location 块中声明文件系统路径,否则 Nginx 找不到文件,防盗链就失去意义:
- 用
root:路径是拼接关系,如root /var/www/html;+location ^~ /static/→ 请求/static/js/app.js对应磁盘路径/var/www/html/static/js/app.js - 用
alias:会替换掉 location 路径前缀,末尾斜杠必须一致,如location /img/ { alias /data/images/; } - 拦截动作推荐
return 403;,语义清晰、日志可查、CDN 和爬虫能正确识别;避免用rewrite跳转到提示图,否则状态码仍是 200,掩盖真实拦截行为
典型配置示例
以下配置允许本站域名、子域、直接访问和代理清空场景,非法请求返回 403:
location ~* \.(jpg|jpeg|png|gif|webp|svg|js|css)$ {
valid_referers none blocked *.example.com example.com www.example.com;
if ($invalid_referer) {
return 403;
}
root /var/www/html;
expires 1y;
add_header Cache-Control "public, immutable";
}
如需展示友好提示图,可用:error_page 403 =200 /images/forbidden.png;,既保持 403 日志记录,又返回一张小图。











