# Nginx教程 - 15 Nginx防盗链

什么是盗链?

盗链(Leeching or Hotlinking)是指一个网站未经允许,直接链接并使用另一个网站的资源(如图片、视频、音频等)。这种做法会导致被盗链的网站的带宽和服务器资源被占用,从而增加其运营成本和服务器负载。

例如,我在我的网站嵌入别人网站的图片,每次请求我的网站,都会从别人的网站加载资源,从而消耗别人网站的带宽。

什么是防盗链?

顾名思义,就是预防别人盗链,限制和保护网站资源的访问和使用。

# 15.1 防盗链的原理

打开浏览器开发者工具,我在我的网站上,查看图片的网络请求信息,可以看到请求头中包含了一个 Referer,这个 Referer 表示是从哪个页面发起的请求,我们可以根据这个字段判断是否是他人网站请求的。


例如,我百度搜索逗比笔记,然后从搜索结果跳转到本站,可以看到请求的 Referer 是从百度来的,如下:

所以防盗链的原理就是判断 Referer 是否是本网站,如果是从浏览器直接请求,则 Referer 为空。

# 15.2 Nginx防盗链配置

在 Nginx 配置文件中,针对 server ,拦截指定的请求,进行防盗链配置:

server {
    listen       80;
    server_name  www.doubibiji.com;

    location / {
        root  /home/doubi/html;  # 站点根目录
        index  index.html;
    }

    location ~* \.(jpg|jpeg|png|gif)$ { # 匹配任何以gif、jpg、jpeg等结尾的文件
        valid_referers none blocked *.doubibiji.com *.yourpartner.com 192.168.0.108;

        # 防盗链配置,如果Referer无效,则返回403 Forbidden  
        if ($invalid_referer) {
            return 403;
        }
        root  /home/doubi/html;  # 一定要配置,否则符合referer要求的请求,找不到资源
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

在上面的配置中,拦截了 gif/jpg/jpeg 等结尾的文件,然后判断文件的 referer 是否是允许的域名或IP。

  • valid_referers:指定哪些Referer是有效的。可以使用多个值,用空格分隔。none 表示允许没有Referer的请求,blocked表示允许被防火墙或代理服务器移除的Referer请求,其他值则允许的域名或IP。
  • if ($invalid_referer):如果请求的Referer不在valid_referers中定义的范围内,则此条件为真,返回403。

上面的两个 location 都配置了相同站点根目录,我们也可以将站点根目录配置为全局的,这样 location 中就不用配置 root 了,修改配置如下:

server {
    listen       80;
    server_name  www.doubibiji.com;

    root  /home/doubi/html;  # 全局指定站点根目录
    index  index.html;  # 首页
  
    location / {
        # ...其他配置
    }

    location ~* \.(jpg|jpeg|png|gif)$ { # 匹配任何以gif、jpg、jpeg等结尾的文件
        valid_referers none blocked *.doubibiji.com *.yourpartner.com 192.168.0.108;

        # 防盗链配置,如果Referer无效,则返回403 Forbidden  
        if ($invalid_referer) {
            return 403;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20