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

[经验分享] 实战Nginx(5)-图片防盗链模块及URL重写模块

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-12-29 09:18:15 | 显示全部楼层 |阅读模式
.图片防盗链模块详解

图片防盗链不需要程序配合,根据图片来源来实现,但是只能先限制基本的图片盗用,无法防止图片采集.

1.referer模块简介
nginx模块ngx_http_referer_module通常用于阻挡来源非法的域名请求.我们应该牢记,伪装Referer头部是非常简单的事情,所以这个模块只能用于阻止大部分非法请求.我们应该记住,有些合法的请求是不会带referer来源头部的,所以有时候不要拒绝来源头部(referer)为空的请求.

2.防盗链模块指令
referer_hash_bucket_size
1
2
3
4
5
6
7
8
语法:
Syntax:     referer_hash_bucket_sizesize;
默认值为64:
Default:   referer_hash_bucket_size64;
配置段:
Context:  server,location
第一次出现是nginx版本1.0.5:
This directive appeared in version 1.0.5.




referer_hash_max_size
1
2
3
4
5
6
7
8
语法:
Syntax:     referer_hash_max_sizesize;
默认值2048k:
Default:   referer_hash_max_size2048;
配置段:
Context:  server,location
第一次出现是nginx版本1.0.5:
This directive appeared in version 1.0.5.




valid_referers
1
2
3
4
5
6
语法:
Syntax:     valid_referersnone | blocked | server_names | string ...;
默认值:
Default:   —
配置段:
Context:  server,location




指定合法的来源’referer’, 他决定了内置变量$invalid_referer的值,如果referer头部包含在这个合法网址里面,这个变量被设置为0,否则设置为1.记住,不区分大小写的.

1
2
3
4
5
none               #“Referer” 来源头部为空的情况;从浏览器输入的。
blocked            #“Referer” 来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头.
server_names       #“Referer”来源头部包含当前的server_names(当前域名)
arbitrary string   #任意字符串,定义服务器名或者可选的URI前缀.主机名可以使用*开头或者结尾,在检测来源头部这个过程中,来源域名中的主机端口将会被忽略掉
regular expression #正则表达式,~表示排除https://或http://开头的字符串.




图片使用来源头部做防盗链是最合理的. 简单、实用。但是没有办法防采集。

3.实例:
1
2
3
4
5
6
7
8
location ~* .(gif|jpg|png|bmp)$ {
   valid_referers none blocked *.stu31.com server_names ~.google.~.baidu.;
   if ($invalid_referer) {
       return 403;
        
#rewrite ^/ wKiom1SfhXLyTGMSAAINXKJWiYA964.jpg ;
    }
}




实例详解:
以上所有来至用户输入,stu31.com和域名中包含google和baidu的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,如果使用下面的rewrite,那么盗链的图片都会显示403.jpg。如果用户直接在浏览器输入你的图片地址,那么图片显示正常,因为它符合none这个规则

.
.重写模块详解

1重写模块介绍
Rewrite 主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可以执行10次,超过后nginx将返回500错误。同时,重写模块包含set指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。

2.重写模块指令
break指令:
1
2
3
4
5
6
语法:
Syntax:     break;
默认值:
Default:   —
应用配置段:
Context:  server,location, if



完成当前设置的重写规则,停止执行其他的重写规则。

if指令:
1
2
3
4
5
6
语法:
Syntax:     if(condition) { ... }
默认值:
Default:   —
应用配置段:
Context:  server,location



注意:尽量考虑使用try_files代替。

判断的条件:
1
2
3
4
5
6
7
(1). 一个变量的名称:空字符传”“或者一些“0”开始的字符串为false。
(2). 字符串比较:使用=或!=运算符
(3). 正则表达式匹配:使用~(区分大小写)和~*(不区分大小写),取反运算!~和!~*。
(4). 文件是否存在:使用-f和!-f操作符
(5). 目录是否存在:使用-d和!-d操作符
(7). 文件、目录、符号链接是否存在:使用-e和!-e操作符
(8). 文件是否可执行:使用-x和!-x操作符







return指令:
1
2
3
4
5
6
7
8
语法:
Syntax:     returncode [text];
            returncode URL;
            returnURL;
默认值:
Default:   —
应用配置段:
Context:  server,location, if




停止处理并为客户端返回状态码。非标准的444状态码将关闭连接,不发送任何响应头。可以使用的状态码有:204,400,402-406,408,410, 411, 413, 416与500-504。如果状态码附带文字段落,该文本将被放置在响应主体。相反,如果状态码后面是一个URL,该URL将成为location头补值。没有状态码的URL将被视为一个302状态码。

rewrite指令:
1
2
3
4
5
6
语法:
Syntax:     rewriteregex replacement [flag];
默认值:
Default:   —
应用配置段:
Context:  server,location, if




按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。可以在重写指令后面添加标记。

注意:如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。
尾部的标记(flag)可以是以下的值:
1
2
3
4
last      #停止处理重写模块指令,之后搜索location与更改后的URI匹配。
break     #完成重写指令。
redirect  #返回302临时重定向,如果替换字段用http://开头则被使用。
permanent #返回301永久重定向。






last详解:
解决死循环,对当前请求的处理检查URL重写规则,如果匹配规则需要被重写,服务器对后续规则无需再检查,让客户端将新的重写请求发送给服务器,服务器重新发起检查,这次检查会重头到尾检查一遍。

如果没用last:
一个location中多条URL重写规则,对请求的处理会检查规则,匹配到后发现需要重写,服务器会通知客户端请求需要重写,客户端就重新发重写过后的请求到服务器,服务器对新的重写好的请求还是需要检查规则,如果检查到匹配某条规则后就又需要重写,客户端就又要发送新的重写请求到服务器,形成循环重写了。

break详解:
客户端发送请求URL到服务器,服务器发现其需要匹配URL重写规则,服务器通知客户端请求需要重写,客户端就将重写过的请求URL发送给服务器,服务器不再检查URL重写规则,直接响应。

rewrite_log指令:
1
2
3
4
5
6
7
语法:
Syntax:     rewrite_logon | off;
默认值:
Default:   rewrite_logoff;
应用配置段:
Context:  http,server, location, if
变量:无





启用时将在error log中记录notice级别的重写日志。

set指令:
1
2
3
4
5
6
语法:
Syntax:     set$variable value;
默认值:
Default:   —
应用配置段:
Context:  server,location, if



为给定的变量设置一个特定值。

uninitialized_variable_warn指令:
1
2
3
4
5
6
语法:
Syntax:     uninitialized_variable_warnon | off;
默认值:
Default:   uninitialized_variable_warnon;
应用配置段:
Context:  http,server, location, if



控制是否记录未初始化变量的警告信息。

3.官方实例:
1
2
3
4
5
6
7
server {
   ...
   rewrite ^(/download/.*)/media/(.*)..*$ $1/mp3/$2.mp3 last;
   rewrite ^(/download/.*)/audio/(.*)..*$ $1/mp3/$2.ra  last;
   return  403;
   ...
}




解释:
如果访问URI为download开头后面跟任意内容,后跟media下跟一个任意名称的以.结尾的所有内容都替换成为download开头后面跟任意内容,把media替换成mp3下跟任意名称以.mp3结尾的内容了,实现了后向引用

.URL重写实验

1.存在一个虚拟主机bbs.stu31.com

1
2
3
4
5
6
7
8
9
10
11
[iyunv@www ~]# vim/etc/nginx/extra/nginx-vhost.conf
server {
       listen 80;
       server_name bbs.stu31.com;
       index index.html index.htm;
       root /www/vhosts/bbs.stu31.com;
       access_log/var/log/nginx/bbs.stu31.com-access.log main;
       location / {
  
       }
}




2.网站测试页:
1
2
[iyunv@www ~]# cat/www/vhosts/bbs.stu31.com/index.html
Welconf to bbs.stu31.com





3.访问测试正常:
1
2
[iyunv@www ~]# curl http://bbs.stu31.com
Welconf to bbs.stu31.com




4.如果bbs网站下存在一个特定images目录,存放一些图片,我就只设置一个测试页吧!
1
2
[iyunv@www ~]# mkdir/www/vhosts/bbs.stu31.com/images
[iyunv@www ~]# echo "this is the imagessite" >/www/vhosts/bbs.stu31.com/images/index.html




6.我们将images这个目录永久移动到pictures目录
1
[iyunv@www ~]# mv/www/vhosts/bbs.stu31.com/images/ /www/vhosts/bbs.stu31.com/pictures




现在访问原来的bbs.stu31.com就会失败;
1
2
3
4
5
6
7
8
[iyunv@www ~]# curlhttp://bbs.stu31.com/images

404 NotFound

404 NotFound

nginx/1.6.2






7.我们配置虚拟主机配置文件进行URL重写,访问bbs.stu31.com/images会自动跳转到我们移动的目录pictures
1
2
3
4
5
6
7
8
9
10
11
[iyunv@www ~]# vim/etc/nginx/extra/nginx-vhost.conf
server {
       listen 80;
       server_name bbs.stu31.com;
       index index.html index.htm;
       root /www/vhosts/bbs.stu31.com;
       access_log /var/log/nginx/bbs.stu31.com-access.log main;
       location / {
                rewrite ^/images/(.*)/pictures/$1;
       }
}




8.重启nginx服务:
1
2
3
4
[iyunv@www ~]# service nginx reload           
nginx: the configuration file/etc/nginx/nginx.conf syntax is ok
nginx: configuration file/etc/nginx/nginx.conf test is successful
Reloading nginx:



                                   [ OK  ]


9.访问测试:
wKioL1Sfhj2QJoH_AAG-w_zW8qk055.jpg


10.我们这里的标志位flag省略了,我们来配置一个标志位测试一下:
设置标志位flag为rediect;这里是临时重定向到pictures目录
rewrite ^/images/(.*) /pictures/$1 redirect;
语法检查,重载服务:
1
2
3
4
5
6
7
[iyunv@www ~]# nginx -t
nginx: the configuration file/etc/nginx/nginx.conf syntax is ok
nginx: configuration file/etc/nginx/nginx.conf test is successful
[iyunv@www ~]# service nginx reload
nginx: the configuration file/etc/nginx/nginx.conf syntax is ok
nginx: configuration file/etc/nginx/nginx.conf test is successful
Reloading nginx:                                          [  OK  ]




测试访问
我们这里访问images服务器响应成302状态,需要客户端重新发送请求URL去访问pictures这个新网站目录:
wKiom1SfhafwhErdAAHJe_AOvVs914.jpg

如果设置标志位flag是last:
rewrite ^/images/(.*) /pictures/$1 last;
浏览器访问:http://bbs.stu31.com/images/
wKioL1SfhmiRb9XbAAFWYu2Wz2s677.jpg

如果标志位是permanent;就是被永久重定向了,状态码301。
rewrite ^/images/(.*) /pictures/$1permanent;
浏览器访问:http://bbs.stu31.com/images/



待续!!!!


运维网声明 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.yunweiku.com/thread-39527-1-1.html 上篇帖子: 实战Nginx(4)-压缩模块与http首部响应报文模块 下篇帖子: 实战Nginx(6)-ssl模块简单应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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