设为首页 收藏本站
查看: 1540|回复: 0

[经验分享] Nginx服务之防盗链功能

[复制链接]

尚未签到

发表于 2018-11-10 14:35:16 | 显示全部楼层 |阅读模式
Nginx防盗链
  一.原理
  二.配置指令
  三.实例配置
一.原理
  盗链是一种损害原有网站合法利益,给原网站所在服务器造成额外负担的非法行为。要采取防盗链的措施,首先需要了解盗链的实现原理。 客户端向服务器请求资源时,为了减少网络带宽,提高响应时间,服务器一般不会一次将所有资源完整地传回给客户端。比如在请求一个网页时,首先会传回该网页的文本内容,当客户端浏览器在解析文本的过程中发现有图片存在时,会再次向服务器发起对该图片资源的请求,服务器将存储的图片资源再发送给客户端。在这个过程中,如果该服务器上只包含了网页的文本内容,并没有存储相关的图片资源,而是将图片资源链接到其他站点的服务器上去了,这就形成了盗链行为。
DSC0000.png

  比如内网用户通过Internet访问域名为www.test.com这个服务器上的WEB服务,而该服务器没有存储图片资源,而是将图片链接到域名为www.fz.com服务器上,这就形成了盗链行为。这种情况下客户端请求 图片资源实际上是来自其他的服务器。
  要实现防盗链,需要了解HTTP协议中的请求头部的Referer头域和采用URL的格式表示访问当前网页或者文件的源地址。通过该头域的值,我们可以检测到访问目标资源的源地址。这样,如果我们检测到Referer头域中的值并不是自己站点内的URL,就采取组织措施,实现防盗链。
  需要注意是,由于Referer头域中的值可以被更改的,因此该方法不能完全阻止所有盗链行为。
二.配置指令
  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 "" > index.html
  客户端用浏览器访问www.test.com,返回的是www.fz.com上 图片资源 ,盗链成功
DSC0001.png

  可以看到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,看看结果怎样?
DSC0002.png

  可以看到请求头信息和原始头信息,因为www.fz.com做了防盗链,只要不是以*.fz.com域名的访问,都转到summer.fz.com/123.jpg去。
  最后补充一下,这只是个人的做法,以供参考,那个画图IP地址是练习用的,公网上不能用私有地址的啦。
  谢谢各位,成功那刻,心里美滋滋的。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-633362-1-1.html 上篇帖子: nginx服务端配置pdf文件下载 下篇帖子: nginx忽略文件名大小写
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表