Nginx防盗链

什么是Nginx防盗链?

客户端向服务器请求资源的时候,先传回网页文本内容,解析文本时发现存在图片时,再向服务器发送图片资源的请求,服务器再把存放图片资源的源发送给客户端,如果该网站的图片资源链接到其他网站的服务器上时,就形成了盗链,Nginx防盗链就是为了防止别人占用你服务器的网络资源,影响你的响应时间

TOC

一、HTTP Referer

当别人的网站使用你url的资源,比如图片链接、网页时,http请求的头部会通过referer值,将该网站当前url带上,告诉服务器本次请求是由这个页面发起
**nginx变量:http_referer** 这个变量的意思就是请求上一次页面访问的地址 比如: 第一次访问一个有图片的网站,先访问这个网页的文本内容,这个时候时第一次访问,http_referer为空
但是还需要访问获取这个网站的图片,再次请求图片资源时,$http_referer就为该网站的地址

valid_referers语法

规则: 在nginx配置中通过valid_referers来获取Referer头中的值,并且根据该值的情况给nginx全局变量invalid_referer赋值,如果Referer头域中没有符合valid_referers指令的值,invalid_referer变量将会被赋值为1。
该指令会根据Referer Header头的内容分配一个值为0或1给变量$invalid_referer

指令内容:

  • valid_referers:表示合法的referers设置
  • none: 表示无Referer值的情况,直接通过浏览器或者其他工具访问
  • blocked:表示有referers,但是值被代理服务器或者防火墙隐藏;
  • server_names:表示一个或多个主机名称。从Nginx 0.5.33版本开始,server_names中可以使用通配符"*"号。lutixia.net 表示通过lutixia.net访问的referers,*.jfedu.net: 表示通过*.jfedu.net访问的referers,*表示任意host主机

比如如下:

valid_referers [none|blocked|server_names] 白名单;
     if ($invalid_referer) {
        return 404;
        #rewrite ^/ http://192.168.0.100/error.jpg;
        }

如果$invalid_referer变量满足白名单里面的值则通过,如果不满足则返回404状态,拦截无法访问该资源

二、Referer值比较

我们先安装一个nginx实例,下面同时存在多个页面

vim nginx.conf
-----------------------------------
server {
    listen       80;
    server_name  localhost;
    root   /var/nginx/html;
    charset utf-8;
    location / {
        autoindex on;
    }
}

我们创建两个html网页,一个用鼠标点击访问,一个用浏览器输入url路径访问,查看Referer值的变化(如下图所示)
nginx.001
我们先用鼠标点击test1.html,可以看到是有Reference的值的,当前的reference信息就是当前网页的信息(如下图所示)
nginx.002
我们使用url加路径也就是访问192.168.31.102/test2.html来访问test2.html,直接输入链接标准的IP+资源是不存在Reference的值的,也就是变量匹配none值(如下图所示)
nginx.003

三、nginx防盗链配置实例

192.168.31.102:
配置防盗链

vim /usr/local/nginx/conf/nginx.conf
----------------------------
server {
    listen       80;
    server_name  localhost;
    root   /var/nginx/html;
    charset utf-8;
    location / {
        index index.html;
    }
    location ~*\.(png|jpg|jpeg|gif|swf)$ {
        valid_referers none blocked 192.168.31.102 127.0.0.1 localhost;
        if ($invalid_referer) {
            return 403;
        }
    }

配置网页

vim /var/nginx/html/index.html
----------------------------
<h1>This is 192.168.31.102!!!</h1>
<img src="test.png"/>

192.168.31.103:
配置网页

vim /var/nginx/html/index.html
----------------------------
<h1>This is 192.168.31.103!!!</h1>
<img src="http://192.168.31.102/test.png"/>

测试结果

我们访问192.168.31.102,可以看到网页文本内容和图片,请求头Reference的值为http://192.168.31.102/(如下图所示)
nginx.004
我们访问192.168.31.103发现图片无法正常显示,请求失败,请求头Reference的值为http://192.168.31.103/因为我们白名单没有设置这个值所以请求失败,这样我们的防盗链就设置成功了(如下图所示)
nginx.005