在 nginx server 块中通过 valid_referers 指令配置防盗链,结合 if ($invalid_referer) 判断,精准保护指定静态资源;需合理设置 referer 白名单并选择 403 或重写提示图响应,避免误拦与安全漏洞。

在 Nginx 的 server 块中配置防盗链,是最常用且推荐的方式——既能精准控制单个站点,又避免影响其他虚拟主机。核心是利用 ngx_http_referer_module 模块的 valid_referers 指令,结合 if ($invalid_referer) 做判断处理。
明确要保护的资源类型
先确定哪些静态文件需要防护,比如图片、视频、脚本等。常见后缀包括:.jpg、.png、.gif、.mp4、.pdf、.js、.css 等。不建议一次性保护所有后缀,应按实际业务需求精简,避免误拦合法请求(如 API 接口或字体文件)。
- 只保护高频被盗资源,例如:
\.(jpg|jpeg|png|gif|mp4|webp)$ - 正则表达式用
~*表示忽略大小写匹配 - 若需区分路径,可将 location 放在特定目录下,如
/images/或/static/
设置合法 Referer 白名单
valid_referers 是关键指令,它定义哪些来源被视为“可信”。参数含义需准确理解:
- none:允许无 Referer 的请求(如用户直接输入 URL、HTTPS 页面跳转到 HTTP 资源、某些隐私模式浏览器)
- blocked:允许 Referer 存在但被防火墙/代理清空或值无效的情况
- yourdomain.com:精确匹配主域名
- *.yourdomain.com:匹配所有子域名(如 blog.yourdomain.com、cdn.yourdomain.com)
-
server_names:自动匹配当前
server_name列表中的所有域名
示例配置中可组合使用:valid_referers none blocked server_names *.yourdomain.com yourdomain.com;
定义非法请求的响应行为
检测到盗链后,有两种主流处理方式,选其一即可:
-
返回 403 错误:最简洁,适合后台监控或日志分析
if ($invalid_referer) { return 403; } -
重写为提示图:更友好,可传递版权信息
if ($invalid_referer) { rewrite ^(.*)$ /images/forbidden.png break; }
注意:/images/forbidden.png需确保该路径本身不受防盗链限制(可单独配 location 放行)
注意事项与避坑点
配置生效前务必确认以下细节:
- 不要把防盗链规则放在
location /这类宽泛路径下,否则可能误拦 HTML 或 API 请求 -
if在 location 中使用是安全的,但在 server 或 http 块中慎用(Nginx 官方不推荐在非 location 块中使用 if) - Referer 可被客户端伪造,该方案主要用于防御普通盗链,不能替代鉴权;高敏感资源建议叠加 URL 签名或 Token 验证
- 修改后执行
nginx -t测试语法,再nginx -s reload生效,切勿直接 kill 进程











