Nginx服务之防盗链功能

Nginx防盗链

一.原理html

二.配置指令nginx

三.实例配置浏览器

一.原理

盗链是一种损害原有网站合法利益,给原网站所在服务器形成额外负担的非法行为。要采起防盗链的措施,首先须要了解盗链的实现原理。 客户端向服务器请求资源时,为了减小网络带宽,提升响应时间,服务器通常不会一次将全部资源完整地传回给客户端。好比在请求一个网页时,首先会传回该网页的文本内容,当客户端浏览器在解析文本的过程当中发现有图片存在时,会再次向服务器发起对该图片资源的请求,服务器将存储的图片资源再发送给客户端。在这个过程当中,若是该服务器上只包含了网页的文本内容,并无存储相关的图片资源,而是将图片资源连接到其余站点的服务器上去了,这就造成了盗链行为。服务器

wKioL1gsBdbTaORsAAEfiXw75v4402.png-wh_50

好比内网用户经过Internet访问域名为www.test.com这个服务器上的WEB服务,而该服务器没有存储图片资源,而是将图片连接到域名为www.fz.com服务器上,这就造成了盗链行为。这种状况下客户端请求 图片资源其实是来自其余的服务器。网络

要实现防盗链,须要了解HTTP协议中的请求头部的Referer头域和采用URL的格式表示访问当前网页或者文件的源地址。经过该头域的值,咱们能够检测到访问目标资源的源地址。这样,若是咱们检测到Referer头域中的值并非本身站点内的URL,就采起组织措施,实现防盗链。app

须要注意是,因为Referer头域中的值能够被更改的,所以该方法不能彻底阻止全部盗链行为。ide


二.配置指令

Nginx配置中有一个指令valid_referers,用来获取Referer头域中的值,而且根据该值的状况给Nginx全局变量$invalid_referer的值,若是Referer头域中没有符合valid_referers指令配置的值,$invalid_referer变量将会被赋值为1。学习

valid_referer指令的语法结构为:测试

valid_referers none | blocked | server_names | string ....;
none 检测Referer头域不存在的请求
blocked 检测Referer头域的值被防火墙或者代理服务器删除或假装的状况。
这种状况下,该头域的值不以“http://”或者“https://”开头
server_names 设置一个或多个URL,检测Referer头域的值是不是这些URL中的某个。
从nginx 0.5.33之后支持使用通配符“*”。


三.实例配置

环境:2台CentOS6操做系统的主机网站

盗链服务器的IP为192.168.16.133 域名www.test.com

被盗链服务器为192.168.16.130  域名www.fz.com

一台win7客户端用来测试,IP为192.168.16.128

最终达到的效果是,www.fz.com站点成功防盗链,并且将客户端请求的URL重写为http://summer.fz.com/123.jpg,成功防止盗链行为。


1.盗链服务器的配置

(1)查看Linux服务器版本

[root@nginx ~]# cat /etc/redhat-release 
CentOS release 6.7 (Final)
[root@nginx ~]# uname -r
2.6.32-573.el6.x86_64

(2)而后我提早编译安装好了Nginx服务,这是nginx版本

[root@nginx ~]# nginx -v
nginx version: nginx/1.11.5

(3)编辑nginx配置文件,建立一个测试的站点

server {              				server标签
listen       80;      				侦听80端口
server_name  www.test.com;     			域名为www.test.com 
location / {   					location块
root   /var/html/test;   			网站根目录在/var/html/test
index  index.html index.htm; 			index首页
access_log      logs/test_access.log;  		访问日志路径
error_log       logs/test_error.log;        	错误日志路径
}

(4)检测语法,平滑重启

[root@nginx test]# nginx -t  检测语法,是否有错误
nginx: the configuration file /application/nginx-1.10.1/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.1/conf/nginx.conf test is successful
[root@nginx test]# nginx -s reload 平滑重启



2.被盗链服务器的配置

(1)查看Linux版本

[root@LNMP ~]# cat /etc/redhat-release 
CentOS release 6.7 (Final)
[root@LNMP ~]# uname -r
2.6.32-573.el6.x86_64

(2)而后我也是提早编译安装好了Nginx服务,这是nginx版本

[root@LNMP ~]# nginx -v
nginx version: nginx/1.10.1

(3)编辑nginx配置文件,建立一个测试的站点

 server {
         listen       80;
         server_name  www.fz.com;
         root    /var/html/fz;
         access_log logs/fz_access.log;
         error_log  logs/fz_error.log;
}

(4)检测语法,平滑重启

[root@LNMP conf]# nginx -t
nginx: the configuration file /application/nginx-1.10.1/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.1/conf/nginx.conf test is successful
[root@LNMP conf]# nginx -s reload


3.如今基本都搭建好,如今www.test.com站点服务器上添加一个html文件

(1)echo双引号的内容的意思是,当客户端访问自身服务器的www.test.com图片资源时,因为没有图片提供给客户端,将图片资源连接到www.fz.com上,从而返回给客户端。

[root@nginx conf]# cd /var/html/test/
[root@nginx test]# echo "<img src = "http://www.fz.com/p_w_picpaths/blog-img1.jpg">" > index.html

客户端用浏览器访问www.test.com,返回的是www.fz.com上 图片资源 ,盗链成功

wKiom1gsGoqgo8BMAACRqPvt55k279.png-wh_50

能够看到Referer的头域的值来自www.test.com


(2)根据文件类型实现防盗链的配置实例

在www.fz.com服务器上编辑nginx.conf配置文件

 28     server {
 29         listen       80;
 30         server_name  www.fz.com;
 31         root    /var/html/fz;
 32         location ~ .*\.(gif|jpg|png|flv|swf|rar|zip)$  
 33         {
 34         valid_referers fz.com *.fz.com;
 35         if ($invalid_referer)
 36         {
 37         rewrite ^/ http://summer.fz.com/123.jpg;
 38         }
 39 }
 40 }
 41         server {
 42         listen  80;
 43         server_name summer.fz.com;
 44         root /var/html/time;
 46 }
 47 }

在配置中,32行当有网络链接对以gid、jpg、png为后缀的图片资源、以flv、swf为后缀的媒体资源以rar、zip为后缀的压缩存档资源发起请求时,34行若是检测到Referer头域中没有符合valid_referers指令配置的值,就将客户端请求 URL重写为http://summer.fz.com/123.jpg。


为何还要一个server标签,这是有缘由的,当时本身看书看博文学习作实验的时候,发现一直跳转不到想要的结果,而是一个空白页面,几经周折,在51的博文无心发现关于Nginx防盗链的一段话,就是37行的rewrite ^/ http://summer.fz.com/123.jpg

这个图片是盗链返回的图片,也就是替换盗链网站全部盗链的图片。这个图片要放在没有设置防盗链的网站上,由于防盗链的做用,这个图片若是也放在防盗链网站上就会被看成防盗链显示不出来了,盗链者的网站所盗链图片会显示X符号。

     

因此为了达到本身期待效果,新建一个server标签,让URL重写到该站点下的图片。

最后,我用客户端再次访问www.test.com,看看结果怎样?

wKioL1gsIqnC5d0EAACSqgEIhcs005.png-wh_50


能够看到请求头信息和原始头信息,由于www.fz.com作了防盗链,只要不是以*.fz.com域名的访问,都转到summer.fz.com/123.jpg去。


最后补充一下,这只是我的的作法,以供参考,那个画图IP地址是练习用的,公网上不能用私有地址的啦。

谢谢各位,成功那刻,内心美滋滋的。

相关文章
相关标签/搜索