Nginx防盗链
什么是Nginx防盗链?
客户端向服务器请求资源的时候,先传回网页文本内容,解析文本时发现存在图片时,再向服务器发送图片资源的请求,服务器再把存放图片资源的源发送给客户端,如果该网站的图片资源链接到其他网站的服务器上时,就形成了盗链,Nginx防盗链就是为了防止别人占用你服务器的网络资源,影响你的响应时间一、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值的变化(如下图所示)

我们先用鼠标点击test1.html,可以看到是有Reference的值的,当前的reference信息就是当前网页的信息(如下图所示)

我们使用url加路径也就是访问192.168.31.102/test2.html来访问test2.html,直接输入链接标准的IP+资源是不存在Reference的值的,也就是变量匹配none值(如下图所示)

三、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/(如下图所示)

我们访问192.168.31.103发现图片无法正常显示,请求失败,请求头Reference的值为http://192.168.31.103/因为我们白名单没有设置这个值所以请求失败,这样我们的防盗链就设置成功了(如下图所示)
