Nginx 防盗链
本文最后更新于:2024年3月18日 凌晨
Nginx 防盗链
介绍
- **什么是防盗链?**盗链可以理解盗图链接,也就是说把别人的图片偷过来用在自己的服务器上,那么防盗链可以理解为防止其他人把我的图片盗取过去。
- 防盗链的实现原理:客户端向服务器端请求资源时,为了减少网络带宽,提高响应时间,服务器一般不会一次将所有资源完整地传回客户端,比如请求一个网页时,首先会传回该网页的文本内容,当客户端浏览器在解析文本的过程中发现有图片存在时,会再次向服务器发起对该图片资源的请求,服务器将存储的图片资源再发送给客户端,但是如果这个图片是链接到其他站点的服务器上去了呢,比如在我项目中,我引用了的是淘宝中的一张图片的话,那么当我们网站重新加载的时候,就会请求淘宝的服务器,那么这就很有可能造成淘宝服务器负担,因此这个就是盗链行为,因此我们要实现防盗链。
- 实现防盗链:使用http协议中请求头部的Referer头域来判断当前访问的网页或文件的源地址,通过该头域的值,我们可以检测访问目标资源的源地址,如果目标源地址不是我们自己站内的URL的话,那么这种情况下,我们采取阻止措施,实现防盗链,但是注意的是:Referer头域中的值是可以被更改的,因此该方法也不能完全安全阻止防盗链。
valid_referers指令
- 该指令可以用来获取 Referer 头域中的值,并且根据该值的情况给 Nginx全局变量
$invalid_referer
赋值。
- 如果Referer头域中没有符合
valid_referers
指令的值的话,$invalid_referer
变量将会赋值为为1
1
| valid_referers none | blocked | server_names | string
|
- none:检测Referer头域不存在的情况。
- blocked:检测Referer头域的值被防火墙或者代理服务器删除或伪装的情况,那么在这种情况下,该头域的值不以"http://" 或 “https://” 开头。
- server_names:设置一个或多个URL,检测Referer头域的值是否是URL中的某个。
根据请求文件类型实现防盗链
1 2 3 4 5 6 7 8 9 10
| server { listen 8080; server_name www.example.com location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ { valid_referers none blocked www.example.com *.baidu.com *.google.com; if ($invalid_referer) { rewrite ^/ http://www.example.com/images/forbidden.png; } } }
|
- 当有网络连接对以 gif,jpg,png为后缀的图片资源时候,当有以swf,flv为后缀的媒体资源时,或以 rar,zip为后缀的压缩资源发起请求时进行检测。
- 如果检测到Referer头域中没有符合 valid_referers指令的话,即请求不是来源于自己网站\百度\谷歌,则返回Forbiden图片。
根据请求目录实现防盗链
1 2 3 4 5 6 7 8 9 10 11
| server { listen 8080; server_name www.example.com location /file/ { root /webroot/; valid_referers none blocked www.example.com *.baidu.com *.google.com; if ($invalid_referer) { rewrite ^/ http://www.example.com/images/forbidden.png; } } }
|
- 当有网络连接对
/file/
目录发起请求时进行检测。
- 如果检测到Referer头域中没有符合 valid_referers指令的话,即请求不是来源于自己网站\百度\谷歌,则返回Forbiden图片。