0%

Nginx防盗链

Nginx 防盗链配置:通过 Referer 验证保护资源

防盗链是防止其他网站非法引用本网站资源(如图片、视频、CSS)的技术手段,Nginx 通过valid_referers指令检查请求的Referer头,识别非法来源并拒绝访问,从而节省带宽、保护知识产权。本文详细讲解 Nginx 防盗链的配置方法、参数含义及实战案例。

防盗链原理:基于 Referer 头验证

  • Referer 头:客户端请求资源时,HTTP 协议会在请求头中包含Referer字段,记录请求的来源页面 URL(如https://example.com/page.html引用了https://yourdomain.com/image.jpg,则Refererhttps://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.comb.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;
}

注意事项与局限性

  1. Referer头可伪造
    Referer是客户端发送的请求头,可被恶意修改,因此防盗链仅能阻止普通盗链,无法应对专业攻击(需结合签名 URL 等更安全的方案)。
  2. 允许直接访问
    若需允许用户直接在浏览器输入 URL 访问资源(如https://yourdomain.com/image.jpg),需包含valid_referers none,否则会被误判为盗链。
  3. HTTPS 与 HTTP 的 Referer 差异
    从 HTTPS 页面引用 HTTP 资源时,部分浏览器会不发送Referer头(出于安全限制),需添加valid_referers blocked允许此类请求。
  4. 性能影响
    valid_referers匹配基于字符串比对,对性能影响极小,可放心在高并发场景使用。

验证防盗链效果

  1. 合法来源测试
    valid_referers允许的域名页面中引用资源,应能正常加载。
  2. 盗链测试
    在其他域名的页面中引用资源,应返回 403 或自定义提示图。
  3. 直接访问测试
    浏览器直接输入资源 URL(无Referer),若配置了valid_referers none,应能正常加载。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10