零基础自学Nginx
文章目录
- 零基础自学Nginx
- 进阶篇
- 2 Nginx静态资源部署
- 2.7 Nginx静态资源防盗链
- 2.7.2 实现原理和实现步骤
进阶篇
2 Nginx静态资源部署
2.7 Nginx静态资源防盗链
2.7.2 实现原理和实现步骤
了解防盗链的原理之前,我们得先学习一个HTTP的头信息Referer,当浏览器向web服务器发送请求的时候,一般都会带上Referer,来告诉浏览器该网页是从哪个页面链接过来的。
后台服务器可以根据获取到的这个Referer信息来判断是否为自己信任的网站地址,如果是则放行继续访问,如果不是则可以返回403(服务端拒绝访问)的状态信息。
在本地模拟上述的服务器效果:
还是这张图片
保存重新加载
这下我们把这个图片地址也加到我们那个 a.html 中
访问一下a.html
没问题,因为我们没有配置防盗链,这边就相当于把8080 服务器的图片资源盗取过来了
【这下我们开始实现】
Nginx防盗链的具体实现:
valid_referers:nginx会通就过查看referer自动和valid_referers后面的内容进行匹配,如果匹配到了就将$invalid_referer变量置0,如果没有匹配到,则将$invalid_referer变量置为1,匹配的过程中不区分大小写。
语法 | valid_referers none|blocked|server_names|string… |
默认值 | — |
位置 | server、location |
none: 如果Header中的Referer为空,允许访问
blocked:在Header中的Referer不为空,但是该值被防火墙或代理进行伪装过,如不带"http://" 、"https://"等协议头的资源允许访问。
server_names:指定具体的域名或者IP
string: 可以支持正则表达式和*的字符串。如果是正则表达式,需要以~
开头表示,例如
location ~*\.(png|jpg|gif){
valid_referers none blocked www.baidu.com 192.168.200.222 *.example.com example.* www.example.org ~\.google\.;
if ($invalid_referer){
return 403;
}
root /usr/local/nginx/html;
}
直接开始加上验证吧
重新加载
直接访问是正常的
这次通过a.html 就不行了,看看控制台
因为这个不等于 www.baidu.com ,所以不能被你“盗用”,如果我改成一样的
遇到的问题:图片有很多,该如何批量进行防盗链?【针对目录】
配置如下:
location /images {
valid_referers none blocked www.baidu.com 192.168.200.222 *.example.com example.* www.example.org ~\.google\.;
if ($invalid_referer){
return 403;
}
root /usr/local/nginx/html;
}
直接访问可以
通过a.html 不行
这样我们可以对一个目录下的所有资源进行防盗链操作。
遇到的问题:Referer的限制比较粗,比如随意加一个Referer,上面的方式就无法进行限制了。那么这个问题改如何解决?
此处我们需要用到Nginx的第三方模块ngx_http_accesskey_module
,第三方模块如何实现盗链,如果在Nginx中使用第三方模块的功能,这些我们在后面的Nginx的模块篇再进行详细的讲解。