nginx防盗链需在匹配静态资源的location块中配置valid_referers指令,结合正则精确匹配文件类型,指定合法referer来源,并配合alias/root路径设置及cdn回源放行,最后通过curl和日志验证效果。

在 Nginx 中实现防盗链,核心是通过 valid_referers 指令识别合法来源,再配合 location 块对特定资源(如图片、CSS、JS、视频等)做访问控制。关键在于:把防盗链逻辑放在匹配静态资源的 location 里,而不是全局或 server 块顶层。
只对指定后缀资源启用防盗链
推荐用正则 location 精确匹配需要保护的文件类型,避免误拦 HTML 或 API 接口:
location ~* \.(jpg|jpeg|png|gif|webp|js|css|woff2?|ttf|eot|svg)$ {
valid_referers none blocked server_names *.example.com example.com;
if ($invalid_referer) {
return 403;
# 或者返回默认图:rewrite ^(.*)$ /static/forbidden.png break;
}
}-
~*表示忽略大小写的正则匹配 -
valid_referers中none允许直接输入 URL 访问(如用户手动打开图片),blocked拦截 Referer 被伪造或被隐私插件清空的情况 -
server_names后跟你的域名(支持通配符*.example.com),多个域名用空格分隔
结合 root 或 alias 定位资源路径
如果静态资源不在默认 root 下,需在 location 内显式指定路径,确保 rewrite 或返回操作能正确找到文件:
location /img/ {
alias /data/www/static/images/;
valid_referers *.example.com example.com;
if ($invalid_referer) {
return 403;
}
}-
alias会完全替换匹配路径,/img/logo.png→/data/www/static/images/logo.png -
root是拼接路径,root /data/www;+location /img/→/data/www/img/ - 防盗链规则必须写在
alias或root所在的 location 内部才生效
排除内部请求或 CDN 回源
若使用 CDN(如 Cloudflare、阿里云 CDN),其回源请求的 Referer 可能为空或为 CDN 域名,需额外放行:
valid_referers none blocked server_names *.example.com example.com *.cdn.example.com;
- 添加 CDN 域名到
valid_referers列表中(注意通配符格式) - 也可用
$http_x_forwarded_for或自定义 header 配合map实现更细粒度判断,但需谨慎避免绕过 - 测试时可用 curl 模拟 Referer:
curl -H "Referer: https://bad-site.com" https://example.com/logo.png
调试与验证要点
防盗链容易误伤正常访问,上线前务必验证:
- 浏览器直接打开图片 URL(Referer 为空)→ 应允许(靠
none) - 从自己站点 HTML 中引用该图片 → 应允许(Referer 是你的域名)
- 用其他网站 iframe 或 img 标签引用 → 应返回 403
- 检查 Nginx error log,搜索
access forbidden by rule确认拦截是否按预期触发 - 修改配置后执行
nginx -t && nginx -s reload,不要直接 kill 进程











