vlambda博客
学习文章列表

我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心

我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心

概述


对于图片来说,A网站,如果想使用B网站的图片,可以直接写上B网站图片的链接地址,或者将B网站的图片通过右键另存为的方式下载到本地,然后在页面上使用。
如果B网站不想A网站这么干了,那么B网站可以采取防盗链的措施来干这个工作,结果就是,A网站想请求所需要的资源,通过url的方式,获取的可能不是原来的图片了,出现404或者别的图片替代了。如果通过浏览器直接打开图片url,那么仍然有可能显示404,这就是防盗链。
Nginx可以很好的做这个工作,先介绍防盗链的nginx location配置:
location ~* \.(jpg)$ { root html; valid_referers 192.168.42.135; if ($invalid_referer){ rewrite ^/ http://192.168.42.135/images/loading.png; }
}


我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心
我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心

配置截图


我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心
该配置是说过滤请求jpg的,并且不是虚拟机本机的IP的访问。对于png图片,可以随意访问。
测试思路:准备三张图片,分别是avatar.jpg,访问这个图片,如果做了防盗链,那么会请求到loading.png(第二张),当请求image.png(第三张)时,他不在防盗链的规则里面,所以可以正常访问。


我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心
我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心

测试过程


1. 所需的资源,本机以及虚拟机,本机启动一个http服务,这里使用python3启动一个简单的HTTP服务。虚拟机通过nginx来启动一个web http服务。物理机上访问本地index.html,页面内容如下:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>index</title><style type="text/css">*{margin:0;padding:0;}.avatar{width:200px;overflow: hidden;border:1px solid lightblue;}img{width:100%;display: block;}</style></head><body><h2>hello,this is a server by python http</h2><div class="avatar"><img src="http://192.168.42.135/images/avatar.jpg" alt="设置防盗链"></div><div class="avatar"><img src="http://192.168.42.135/images/image.png" alt="没有防盗链"></div></body></html>
2. 本机在index.html所在的目录启动http服务:
我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心
3. 虚拟机nginx目录的html目录下准备index.html,images文件夹,images文件夹中准备三个文件,分别是:
avatar.jpg,loading.png,image.png。
 index.html
<!DOCTYPE html><html><head><title>Welcome to OpenResty!</title><style> *{margin:0;padding:0} .avatar{width:200px;overflow:hidden;border:1px solid lightblue;} img{width:100%;display:block;}</style></head><body><h2>welcome to nginx!</h2> <div class="avatar"><img src="http://192.168.42.135/images/avatar.jpg"/></div> <div class="avatar"><img src="http://192.168.42.135/images/image.png"/></div></body></html>
html目录下的内容: 
我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心
4. 启动nginx,我们分别通过本地ip地址访问本机的index.html,以及通过虚拟机的ip访问虚拟机nginx:
本地访问:http://10.119.9.167:8000/虚拟机访问:http://192.168.42.135/
没有做防盗链设置的时候,访问图片,没有太大的区别:
我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心
做了防盗链,本机访问虚拟机的图片地址,会显示loading图片,而直接访问虚拟机nginx首页就不会出现loading图片:
我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心
对于本例中做了防盗链配置的情况,不容许referer为空,即通过浏览器直接打开图片的情况,会看到,先请求了avatar.jpg,最终会响应302跳转到loading.png:
我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心
这个示例,就演示了防盗链是如何实现的。
 一般的防盗链,我们的配置如下:
location ~* \.(gif|jpg|swf)$ { valid_referers none blocked start.igrow.cn sta.igrow.cn; if ($invalid_referer) { rewrite ^/ http://$host/logo.png; }}
nginx防盗链是通过分析访问资源的源网站,即referer来自哪里:
①通过浏览器直接打开img的url,这时候是没有referer的,如果容许这一类,那么配置valid_referers可以包括none。
②如果referer不为空,但是里面的内容被防火墙或者代理服务器删除了,也容许这一类的话,可以通过配置blocked来绕过。
③如果通过网站来打开,比如:
http://10.119.9.167:8000/
那么请求图片的请求,中会携带referer,我们如果容许,可以把需要绕过的域名在这里写上。
通过网站引用图片的,我们通过开发者工具可以清楚的看到请求的Referer:
我给HR小姐姐讲了Nginx防盗链,我俩聊的很开心
valid_referers none blocked start.igrow.cn sta.igrow.cn 
这个防盗链的配置,是说容许浏览器打开,容许referer有内容但被防火墙删除了,容许来自start.igrow.cn、sta.igrow.cn网站的请求。
本示例中,为了防止浏览器打开,只容许虚拟机IP所在的机器上的网站访问图片,所以只是简单的配置了:
valid_referers 192.168.42.135;
到这里,防盗链的内容就差不多介绍完了。基本思路就是过滤不信任的网站请求有关的图片。

内容来源于网络,侵删



鉴于篇幅有限,更多详细课程大纲/知识体系/实体书籍/网工必备工具包等请扫码加群获取!

领取福利


种下一棵树
最好的时间是10年前
其次是现在
学习也一样