文章介绍了资源盗链的概念,通过示例展示了如何利用Nginx的ngx_http_referer_module模块设置资源防盗链,通过检查Referer字段限制外部站点对资源的访问,从而保护网站的静态资源不被非法引用。
简单地说,就是将别人的资源用到自己的页面展示给用户。
1)准备图片
这两张图片直接在浏览器中访问都是可以打开的。
github图片地址:https://github.githubassets.com/images/modules/site/home-campaign/hero-drone.webp
豆瓣图片地址:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2889598060.webp
2)html准备
cd /usr/local/nginx/html
touch test.html
test.html
<!DOCTYPE html>
<html>
<body>
<img src="https://github.githubassets.com/images/modules/site/home-campaign/hero-drone.webp"/>
<br/ >
<img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2889598060.webp" alt="douban">
</body>
</html>
展示效果:访问http://192.168.110.98/test.html
查看控制台:
说明douban的图片资源做了防盗链处理。
那么我们自己的资源如何做防盗链处理呢?
关于资源防盗链,我们需要先理解一个概念,那就是请求头中的Referer字段信息,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从那个页面过来的,web服务器根据这个信息进行一些处理,资源防盗链的处理也是根据该字段信息进行相应处理。
🔔Tips:请求头的Referer字段信息是可以通过程序伪装生成的,因此根据Referer信息来实现防盗链并非100%可靠,但是,它能够限制大部分的盗链。
1)准备资源
test.jfif图片:
2)将资源放到nginx服务器的/usr/local/nginx/html文件夹
3)准备test.html页面
<!DOCTYPE html>
<html>
<body>
<img src="./test.jfif" alt="test">
</body>
</html>
4)访问页面:http://192.168.110.98/test.html
可以看到,目前的我们的资源是可以正常访问的,接下来,我们将做一些防盗链的措施。
我们知道web服务器是根据请求头的Referer字段值来判断请求是从哪个页面发送过来的,nginx提供了ngx_http_referer_module模块,来对该信息进行处理。
下面我们来看看相关语法:
作用域:server, location
语法:valid_referers none | blocked | server_names | string …;
1)valid_referers none;
表示请求头中不存在Referer字段。
2)valid_referers blocked;
表示请求头中存在Referer字段,且其值不以http://或https://开头
3)valid_referers server_names;
表示请求头中存在Referer字段,且其值包含nginx配置文件中server_name的其中一个
4)任意字符串
表示请求头中存在Referer字段,且定义了服务器名称和可选的URI前缀。服务器名称的开头或结尾可以有一个“*”。在检查过程中,“Referer”字段中的服务器端口被忽略;
5)正则表达式
表示请求头中存在Referer字段,且第一个符号应该是“~”。需要注意的是,表达式将从http://或https://之后开始的文本相匹配。
示例:
valid_referers none blocked server_names *.example.com test.example.* ~\.example\.com
除了使用valid_referers指令外,我们还需要用到一个变量$invalid_referer,如果“Referer”请求标头字段值被认为有效,则为空字符串,否则为“1”。
5)配置资源防盗链
因为我们现在要访问test.gfif图片,所以我们如下配置:
location ~^/.*\.(png|jpg|gif|jfif) {
valid_referers www.example.com;
if ($invalid_referer){
return 403;
}
root html;
}
🔔Tips:正则表达式必须以~开头。
这个时候我们再来访问http://192.168.110.98/test.html,显示无法访问。
我们查看其请求头的Referer字段:Referer:http://192.168.110.98/test.html,因此被拒绝访问了。
以上就是Nginx配置静态资源防盗链,Nginx是多模块化的,还有很多高级功能,我们后面继续探索。