Nginux Rewte 相关功能
Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求
此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库
rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能
比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问另外还可以在一定程度上提高网站的安全性。
1.1 模块指令
1.1.1 if 指令
用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:
if (条件匹配){
action
}
条件匹配成功是会认为是true,失败则是false
正则表达变量含义
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
配置示例location /test {index inde.html;default_type text/html;if ( $scheme = http ){echo "if----->$scheme";}}
测试:
[root@webserver ~]# curl timilee.org/test
if----->http
[root@webserver ~]#
1.1.2 set 指令
指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key
另外set定义格式为set $key value,value可以是text, variables和两者的组合
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen 80;server_name timinglee.org;root /web/nginx/lee/;location /test3{set $name lee;echo $name;}
}
测试:
[root@web ~]# curl timinglee/test3
lee
1.1.3 break 指令
用于中断当前相同作用域(location)中的其他Nginx配置与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效位于后面的 ngx_http_rewrite_module 模块中指令就不再执行
Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置该指令可以在server块和locationif块中使用.
注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module
模块的指令,其它指令还会执行
location /test {index inde.html;default_type text/html;set $name haha;echo $name;break;set $port $server_port;echo $port;}
location /test {index inde.html;default_type text/html; set $name haha;echo $name;set $port $server_port;echo $port;}
1.1.4 return 指令
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重
定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配
置都将不被执行,return可以在server、if 和 location块进行配置
语法格式:
语法格式:return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容#可以调用变量,其中text如果有空格,需要用单或双引号
return code URL; #返回给客户端的URL地址location /return/{default_type text/html;if ( !-e $request_filename){ #检测文件存不存在,不存在则转到百度页面,存在则打印出该文件及其路径 is existreturn 301 http://www.baidu.com;}echo "$request_filename is exist";}[root@webserver ~]# curl timilee.org/return/index.html #文件存在
/web/nginx/lee/return/index.html is exist
[root@webserver ~]# curl timilee.org/return/index1.html #文件不存在
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.26.1</center>
</body>
</html>
location /test {index inde.html;default_type text/html;return 200 '{"status:""success"}';}测试:```
[root@webserver ~]# curl timilee.org/test
{"status:""success"}
[root@webserver ~]#
```
1.2rewrite指令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,
rewrite主要是针对用户请求的URL或者是URI做具体处理
语法格式:
rewrite regex replacement [flag];
rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制
如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向301
正则表达含义:
. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字
\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W #匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^lee] #匹配除了lee 这几个字母以外的任意字符
1.2.1rewrite flag 使用介绍
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrite有四种不同的flag,分别是redirect(临时
重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型
跳转型指由客户端浏览器重新对新地址进行请求
代理型是在WEB服务器内部实现跳转
1.2.2永久重定向与临时重定向
location / {
root /data/nginx/html/pc;
index index.html;
rewrite / http://timinglee.com permanent;}
#重启Nginx并访问域名 http://timinglee.org 进行测试
永久重定向301
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name timilee.org;
root /webdata/nginx/timilee.org/lee;
location / {
rewrite / http://timilee.com permanent;
}
}
server {
listen 80;
server_name timilee.com;
root /webdata/nginx/timilee.com/lee;
}
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen 80;server_name timilee.org;root /webdata/nginx/timilee.org/lee;location / {rewrite / http://timilee.com redirect;#rewrite / http://timilee.com permanent;}
}server {
listen 80;
server_name timilee.com;
root /webdata/nginx/timilee.com/lee;
}
1.2.3 break和last
location /break/ {rewrite ^/break/(.*) /test1/$1 break;rewrite ^/break/(.*) /test2/$1;}location /last/{rewrite ^/last/(.*) /test2/$1 last;rewrite ^/last/(.*) /test1/$1;}location /test1/{return 200 "test1 ha";}location /test2/{return 200 "test2 haha";}
1.2.4防盗链
在 Nginx 中,可以通过配置文件实现防盗链功能,防止其他网站未经授权直接链接到你的资源(如图片、视频、CSS、JS 等)。这不仅可以保护你的内容不被滥用,还能节省带宽和服务器资源。
防盗链的基本原理
防盗链的核心思想是检查 HTTP 请求头中的 Referer
字段。Referer
字段通常包含请求来源页面的 URL。通过验证这个字段,可以判断请求是否来自允许的网站。
配置解释:
none: #请求报文首部没有referer首部,#比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
blocked: #请求报文有referer首部,但无有效值,比如为空。
server_names: #referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string: #自定义指定字符串,但可使用*作通配符。
示例:
*.timinglee.org
www.timinglee.*regular expression: #被指定的正则表达式模式匹配到的字符串,要使用~开头,
例如:
~.*\.timinglee\.com
实现盗链
在RS1上配置apache
[root@web ~]# vim /var/www/html/index.html
html><head><meta http-equiv=Content-Type content="text/html;charset=utf-8"><title>盗链</title></head><body><img src="http://timilee.org/images/haha.png" > #这放置的是正常的图片<h4 style="color:red">欢迎大家</h4><p><a href=http://timilee.org>狂点这里</a>出门见喜</p></body>
</html>
写入域名解析
[root@web ~]# cat /etc/hosts
192.168.217.10 timilee.org
[root@web ~]#
实现防盗链
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen 80;server_name www.timinglee.org;root /data/web/html;index index.html;location / {valid_referers none blocked server_names *.timinglee.org ~/.baidu/.;if ($invalid_referer){return 404;}}location /images {valid_referers none blocked server_names *.timinglee.org ~/.baidu/.;if ($invalid_referer){rewrite ^/ http://www.timinglee.org/daolian.png permanent; #注意此图片
不能和正常图片放在一个目录中}}
}
#重启Nginx并访问测试