Nginx (四)

一、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

推荐阅读更多精彩内容