Nginx 防盗链配置:通过 Referer 验证保护资源
防盗链是防止其他网站非法引用本网站资源(如图片、视频、CSS)的技术手段,Nginx 通过valid_referers
指令检查请求的Referer
头,识别非法来源并拒绝访问,从而节省带宽、保护知识产权。本文详细讲解 Nginx 防盗链的配置方法、参数含义及实战案例。
防盗链原理:基于 Referer 头验证
- Referer 头:客户端请求资源时,HTTP 协议会在请求头中包含
Referer
字段,记录请求的来源页面 URL(如https://example.com/page.html
引用了https://yourdomain.com/image.jpg
,则Referer
为https://example.com/page.html
)。
- 防盗链逻辑:Nginx 通过
valid_referers
定义 “合法来源”,若请求的Referer
不在合法列表中,则判定为盗链,返回 403 Forbidden。
基础配置示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| server { listen 80; server_name yourdomain.com; root /var/www;
# 对图片、视频等静态资源启用防盗链 location ~* \.(jpg|jpeg|png|gif|mp4|css|js)$ { # 定义合法的Referer来源 valid_referers none # 允许无Referer的请求(如直接在浏览器输入URL访问) blocked # 允许Referer被防火墙或代理隐藏的请求 server_names # 允许来自本域名的请求(yourdomain.com及其子域名) *.yourdomain.com # 允许指定域名及其子域名 *.trusted-site.com; # 允许信任的第三方网站
# 若Referer不合法,则返回403 if ($invalid_referer) { return 403; # 可选:返回自定义图片(如“盗链必究”提示图) # rewrite ^/ /forbidden.png last; } } }
|
valid_referers
参数详解
valid_referers
用于定义 “合法来源”,支持多种格式:
参数 |
含义 |
none |
允许无Referer 头的请求(如直接访问资源 URL) |
blocked |
允许Referer 头被防火墙或代理移除的请求(Referer 值不以http:// 或https:// 开头) |
server_names |
允许来自当前虚拟主机server_name 的请求(如yourdomain.com ) |
*.example.com |
允许指定域名及其子域名(如a.example.com 、b.example.com ) |
example.com/page.html |
允许来自特定页面的请求(精确匹配) |
高级配置:灵活控制防盗链规则
1. 仅允许本站引用,禁止外部访问
1 2 3 4 5 6 7
| location ~* \.(jpg|png|gif)$ { # 仅允许无Referer(直接访问)或本站域名的请求 valid_referers none server_names; if ($invalid_referer) { return 403; } }
|
2. 对不同资源设置不同规则
1 2 3 4 5 6 7 8 9 10 11
| # 图片严格防盗链(仅允许本站) location ~* \.(jpg|png)$ { valid_referers none server_names; if ($invalid_referer) { return 403; } }
# CSS/JS允许信任的网站引用 location ~* \.(css|js)$ { valid_referers none server_names *.trusted-site.com; if ($invalid_referer) { return 403; } }
|
3. 盗链时返回自定义提示图
1 2 3 4 5 6 7 8 9 10 11 12 13
| location ~* \.(jpg|png)$ { valid_referers server_names; if ($invalid_referer) { # 盗链时返回自定义图片(需提前准备/var/www/forbidden.png) rewrite ^/ /forbidden.png last; } }
# 确保自定义图片本身不被防盗链限制 location = /forbidden.png { # 关闭防盗链检查 valid_referers any; }
|
注意事项与局限性
Referer
头可伪造:
Referer
是客户端发送的请求头,可被恶意修改,因此防盗链仅能阻止普通盗链,无法应对专业攻击(需结合签名 URL 等更安全的方案)。
- 允许直接访问:
若需允许用户直接在浏览器输入 URL 访问资源(如https://yourdomain.com/image.jpg
),需包含valid_referers none
,否则会被误判为盗链。
- HTTPS 与 HTTP 的 Referer 差异:
从 HTTPS 页面引用 HTTP 资源时,部分浏览器会不发送Referer
头(出于安全限制),需添加valid_referers blocked
允许此类请求。
- 性能影响:
valid_referers
匹配基于字符串比对,对性能影响极小,可放心在高并发场景使用。
验证防盗链效果
- 合法来源测试:
在valid_referers
允许的域名页面中引用资源,应能正常加载。
- 盗链测试:
在其他域名的页面中引用资源,应返回 403 或自定义提示图。
- 直接访问测试:
浏览器直接输入资源 URL(无Referer
),若配置了valid_referers none
,应能正常加载。
v1.3.10