一、ngx_http_rewrite_module
将用户请求的URI基于PCRE regex所描述的模式进行检查,而后完成重定向替换
1、 rewrite regex replacement [flag]
2、 return
3、 rewrite_log on | off;
4、 set $variable value;
5、 if (condition) { ... }
二、ngx_http_referer_module
1、 valid_referers none|
一、ngx_http_rewrite_module
The ngx_http_rewrite_module module is used tochange request URI using PCRE regular expressions,
return redirects, and conditionally select configurations.
将用户请求的URI基于PCRE regex所描述的模式进行检查,而后完成重定向替换
示例:
http://www.a.com/hn--> http://www.a.com/henan
http://www.a.com--> https://www.a.com/
1、 rewrite regex replacement [flag]
将用户请求的URI基于regex所描述的模 式进行检查,匹配到时将其替换为replacement指定的新的URI
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查隐含有循环机制,但不超过10次;
如果超过,提示500响应码, [flag]所表示的标志位用于控制此循环机制
如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端301:永久重定向
[flag]:
last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环
break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;
结束循环,建议在location中使用
redirect:临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;
不能以http://或https://开头,使用相对路径,状态码: 302
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,状态码:301
zz页面跳转到zhengzhou
临时重定向
永久重定向
location /zz 也可以针对zz uri做访问控制 访问zz目录旧跳转到zhengzhou目录下,内容更清晰作用根上面一样
2、 return
作用域:server,location,if
return code [text];
return code URL;
return URL;
停止处理,并返回给客户端指定的响应码
3、 rewrite_log on | off;
是否开启重写日志, 发送至error_log( notice level)
4、 set $variable value;
用户自定义变量
注意:变量定义和调用都要以$开头
5、 if (condition) { ... }
引入新的上下文,条件满足时,执行配置块中的配置指令; server, location
condition:
比较操作符:
== 相同
!= 不同
~:模式匹配,区分字符大小写
~*:模式匹配,不区分字符大小写
!~:模式不匹配,区分字符大小写
!~*:模式不匹配,不区分字符大小写
文件及目录存在性判断:
-e, !-e 存在(包括文件,目录,软链接)
-f, !-f 文件
-d, !-d 目录
-x, !-x 执行
if指令实例
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
当访问admin目录时候系统就会返回403和disallow(返回可自定义)
跳转到别的url www.baidu.com
添加状态码跳转
显示302临时跳转
二、ngx_http_referer_module
通常用于阻挡来源非法的域名请求.我们应该牢记,伪装Referer头部是非常简单的事情,所以这个模块只能用于阻止大部分非法请求.我们应该记住,有些合法的请求是不会带referer来源头部的,所以有时候不要拒绝来源头部(referer)为空的请求.
The ngx_http_referer_module module is used to block access to a site for requests with invalid values in the
“Referer” header field. 可防止盗链
1、 valid_referers none|blocked|server_names|string ...;
定义referer首部的合法可用值,不能匹配的将是非法值
none:请求报文首部没有referer首部
blocked:请求报文有referer首部,但无有效值
server_names:参数,其可以有值作为主机名或主机名模式 本网站
arbitrary_string:任意字符串,但可使用*作通配符
regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,例如: ~.*\.magedu\.com
示例:
valid_referers none block server_names *.a.com *.a.com a.* a.* ~\.baidu\.;
if ($invalid_referer) {
return 403 http://www.a.com;
}
首部添加从哪里跳转过来的
a页面跳转到b页面
vim index.html website B
nginx -s reload
点击www.b.com会看到b.com的文件内容website B
可以从日志看到跳转信息
cd /var/log/nginx
a.com代表从哪里位置跳转
b.com也可以盗用a.com目录下的a.jpg图片
vim b.html 编写website2目录下的页面
打开b.com显示的图片确是a.com的图片,在用户层面也不知道,对a.com来说消耗了它的带宽来为b.com服务
盗链成功
日志查询可以看到从b.com下载的a.jpg
nginx日志都储存在一起,不容易找到可以给文件设置独立存储
第一个日志上会看到图片被转发到哪个网址上面,b.com就是盗链网站
第二个日志是a.com本机正常访问,被转发位置正常是为空
如何防止referers盗链
允许请求
none:请求报文首部没有referer首部
blocked:请求报文有referer首部,但无有效值
server_names:参数,其可以有值作为主机名或主机名模式 本网站
包含baid字符的域名也允许
if.......非法的403,转跳到www.a.com(可自定义网站)
访问www.b.com/b.html 盗链a.com内容已经无法打开,F12可以看到403
网友评论