零基础自学Nginx


文章目录

  • 零基础自学Nginx
  • 进阶篇
  • 2 Nginx静态资源部署
  • 2.7 Nginx静态资源防盗链
  • 2.7.2 实现原理和实现步骤


静态网页在nginx如何使用_nginx

进阶篇

2 Nginx静态资源部署

2.7 Nginx静态资源防盗链
2.7.2 实现原理和实现步骤

了解防盗链的原理之前,我们得先学习一个HTTP的头信息Referer,当浏览器向web服务器发送请求的时候,一般都会带上Referer,来告诉浏览器该网页是从哪个页面链接过来的。

静态网页在nginx如何使用_静态网页在nginx如何使用_02

后台服务器可以根据获取到的这个Referer信息来判断是否为自己信任的网站地址,如果是则放行继续访问,如果不是则可以返回403(服务端拒绝访问)的状态信息。

在本地模拟上述的服务器效果:

静态网页在nginx如何使用_服务器_03

静态网页在nginx如何使用_nginx_04

还是这张图片

静态网页在nginx如何使用_Nginx_05

保存重新加载

静态网页在nginx如何使用_java_06

这下我们把这个图片地址也加到我们那个 a.html 中

静态网页在nginx如何使用_服务器_07

访问一下a.html

静态网页在nginx如何使用_静态网页在nginx如何使用_08

没问题,因为我们没有配置防盗链,这边就相当于把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;

}

直接开始加上验证吧

静态网页在nginx如何使用_静态网页在nginx如何使用_09

重新加载

静态网页在nginx如何使用_服务器_10

直接访问是正常的

静态网页在nginx如何使用_服务器_11

这次通过a.html 就不行了,看看控制台

静态网页在nginx如何使用_nginx_12

因为这个不等于 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;

}

静态网页在nginx如何使用_Nginx_13

静态网页在nginx如何使用_java_14

静态网页在nginx如何使用_java_15

直接访问可以

静态网页在nginx如何使用_java_16

通过a.html 不行

这样我们可以对一个目录下的所有资源进行防盗链操作。

遇到的问题:Referer的限制比较粗,比如随意加一个Referer,上面的方式就无法进行限制了。那么这个问题改如何解决?

此处我们需要用到Nginx的第三方模块ngx_http_accesskey_module,第三方模块如何实现盗链,如果在Nginx中使用第三方模块的功能,这些我们在后面的Nginx的模块篇再进行详细的讲解。