一 . 图片防盗链模块详解
图片防盗链不需要程序配合,根据图片来源来实现,但是只能先限制基本的图片盗用,无法防止图片采集.
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 ^/
;
}
}
实例详解:
以上所有来至用户输入,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.访问测试正常:
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就会失败;
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.访问测试:
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这个新网站目录:
如果设置标志位flag是last:
rewrite ^/images/(.*) /pictures/$1 last;
浏览器访问:http://bbs.stu31.com/images/
如果标志位是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