<p>可通过Nginx的location ~* .(jpg|png)$</code>统一匹配图片请求并配置<code>valid_referers</code>实现防盗链,支持大小写不敏感、直接访问、空referer及指定域名,配合<code>if ($invalid_referer)返回403。</p>

可以通过 Nginx 的 location 指令配合正则表达式,对 .jpg 和 .png 请求统一做防盗链控制,核心是用一个 location 块匹配两类后缀,并在其中嵌入 valid_referers 判断逻辑。
使用正则 location 匹配图片后缀
Nginx 支持 ~* 开头的不区分大小写的正则匹配。只需一条规则即可覆盖常见大小写变体(如 .JPG、.Png):
-
location ~* \.(jpg|png)$ { ... }—— 匹配以 .jpg 或 .png(不区分大小写)结尾的 URI - 该规则会生效于
/a.jpg、/b.PNG、/c/photo.Jpg等路径,但不会误伤/api.jpg/xxx(因未以扩展名结尾),符合常规静态资源路径习惯
在 location 内配置防盗链逻辑
匹配到图片后,通过 valid_referers 定义合法来源,再用 if ($invalid_referer) 拦截非法请求:
- 先声明允许的 referer:例如
valid_referers none blocked server_names *.example.com; -
none允许直接访问(如书签、浏览器地址栏输入) -
blocked允许 Referer 被防火墙或隐私插件清空的情况 -
server_names和通配符支持主站及子域名(如*.cdn.example.com) - 在
if ($invalid_referer) { return 403; }中返回禁止访问,也可设为return 404或重定向到默认占位图
补充建议与注意事项
为避免影响正常服务和 CDN 缓存,还需注意几点:
- 确保该
location块位于更通用的静态文件 location(如location /)之前,Nginx 按顺序匹配,正则 location 优先级高于前缀匹配 - 若使用 CDN,需确认其是否透传真实 Referer;部分 CDN 默认会改写或清空 Referer,此时应将 CDN 域名加入
valid_referers - 可配合
add_header Referrer-Policy "no-referrer-when-downgrade";控制浏览器发送 Referer 的行为,提升前端可控性 - 测试时可用
curl -H "Referer: https://evil.com" https://yoursite.com/test.png验证拦截是否生效

















