小知识:Nginx rewrite正则匹配重写的方法示例

Nginx的rewrite功能支持正则匹配重写,即将URL地址临时或永久重新指向某个新的位置,类似于重定向。这个特性有利用当网站结构做出重大调整,如之前的网站mp3资源使用URL为www.site1.org/mp3进行访问,而现在服务器上mp3目录已经被使用music目录替换,那rewrite这个功能则能够轻松实现。其次如可以将site1.org强制调整到www.site1.org,反之亦可。这个指令位于ngx_http_rewrite_module模块。本文主要描述这个指令的用法并给出演示。

一、rewrite指令语法描述

句法: rewrite regex replacement [flag];

默认: –

语境: server,location,if

如果指定的正则表达式与请求URI匹配,则URI将按照replacement字符串中的指定进行更改。

该rewrite指令在其在配置文件中出现的顺序顺序地执行。可以使用标志终止对伪指令的进一步处理。

如果替换字符串以“ http://”,“ https://”或“ $scheme” 开头,则处理停止,并将重定向返回给客户端。

flag标志的作用是用于控制当匹配到对应的rewrite规则后是否继续检查后续的rewrite规则

可选flag参数可以是以下之一:

last

一旦被当前规则匹配并重写后立即停止检查后续的其它rewrite的规则,而后通过重写后的规则重新发起请求;

break

一旦被当前规则匹配并重写后立即停止后续的其它rewrite的规则,而后继续由nginx进行后续操作;

redirect

如果替换字符串不以“ http://”,“ https://”或“ $scheme” 开头,则使用,返回302临时重定向;

permanent

返回301永久重定向;

注意:一般将rewrite写在location中时都使用break标志,或者将rewrite写在if上下文中;

其他指令

rewrite_log on|off

是否把重写过程记录在错误日志中;默认为notice级别;默认为off;

return code:

用于结束rewrite规则,并且为客户返回状态码;可以使用的状态码有204, 400, 402-406, 500-504等;

二、基于location上下文rewrite功能演示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
本机环境
# more /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
# nginx -v
nginx version: nginx/1.12.2
配置nginx
# vim /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name site1.orag www.site1.org;
location / {
root /www/site1.org;
index index.html index.htm;
}
}
# mkdir -pv /www/site1.org/images
# echo “This is a rewrite test page.”>/www/site1.org/index.html
# cp /usr/share/backgrounds/gnome/*.jpg /www/site1.org/images/
# vim /etc/hosts
192.168.1.175 site1.org
192.168.1.175 www.site1.org
# curl http://www.site1.org
This is a rewrite test page.
# curl -I http://www.site1.org/images/Waves.jpg
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Wed, 01 Nov 2017 03:47:58 GMT
Content-Type: image/jpeg
Content-Length: 458818
Last-Modified: Wed, 01 Nov 2017 03:43:48 GMT
Connection: keep-alive
ETag: “59f942f4-70042”
Accept-Ranges: bytes
修改rewrite.conf文件,添加rewrite指令
location / {
root /www/site1.org;
index index.html index.htm;
rewrite ^/images/(.*)$ /imgs/$1 last;
}
# systemctl reload nginx
# curl -I http://www.site1.org/images/Waves.jpg
HTTP/1.1 404 Not Found
Server: nginx/1.12.2
Date: Wed, 01 Nov 2017 04:02:38 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
# mkdir -pv /www/site1.org/imgs
# mv /www/site1.org/images/Waves.jpg /www/site1.org/imgs/.
# curl -I http://www.site1.org/images/Waves.jpg
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Wed, 01 Nov 2017 04:05:07 GMT
Content-Type: image/jpeg
Content-Length: 458818
Last-Modified: Wed, 01 Nov 2017 03:43:48 GMT
Connection: keep-alive
ETag: “59f942f4-70042”
Accept-Ranges: bytes
# curl -I http://www.site1.org/imgs/Waves.jpg ##这种方式可以访问
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Wed, 01 Nov 2017 04:06:17 GMT
Content-Type: image/jpeg
Content-Length: 458818
Last-Modified: Wed, 01 Nov 2017 03:43:48 GMT
Connection: keep-alive
ETag: “59f942f4-70042”
Accept-Ranges: bytes
模拟rewrite导致的http 500错误
再次对rewrite.conf文件做如下修改,
location / {
root /www/site1.org;
index index.html index.htm;
rewrite ^/images/(.*)$ /imgs/$1 last;
rewrite ^/imgs/(.*)$ /images/$1 ;
}
# systemctl restart nginx
# curl -I http://www.site1.org/imgs/Waves.jpg
HTTP/1.1 500 Internal Server Error
Server: nginx/1.12.2
Date: Wed, 01 Nov 2017 05:23:16 GMT
Content-Type: text/html
Content-Length: 193
Connection: close
# curl -I http://www.site1.org/images/Waves.jpg
HTTP/1.1 500 Internal Server Error
Server: nginx/1.12.2
Date: Wed, 01 Nov 2017 05:23:28 GMT
Content-Type: text/html
Content-Length: 193
Connection: close
通过上述的测试可知,出现了死循环导致的500错误。
Nginx官方给出的参考样例:
server {
… ##rewrite指令位于server上下文
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
##将/download目录中包含media目录下的任意文件请求重定向为donwload/任意/mp3/任意.mp3
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
##将/download目录中包含audio目录下的任意文件请求重定向为donwload/任意/mp3/任意.mp3
return 403;
}
location /download/ { ##rewrite指令位于location上下文
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
##该last标志应该被替换 break,否则nginx将使10个周期返回500个错误
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}

三、基于if条件判断rewrite功能演示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# vi /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name site1.orag www.site1.org;
if ($host != www.site1.org ) {
rewrite ^/(.*)$ http://www.site1.org/$1 permanent;
}
location / { ##Author : Leshami
root /www/site1.org; ##Blog : http://blog.csdn.net/leshami
index index.html index.htm;
rewrite ^/images/(.*)$ /imgs/$1 last;
rewrite ^/imgs/(.*)$ /images/$1 ;
}
}
# systemctl reload nginx.service
本地测试(修改本地host文件)
# curl http://site1.org
<html> ##返回301状态码
<head><title>301 Moved Permanently</title></head>
<body bgcolor=”white”>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>
Windows环境测试
通过修改Windows机器Host文件后,添加如下条目
192.168.1.175 centos7-router.com
192.168.1.175 www.centos7-router.com
打开浏览器,通过域名的方式进行访问http://site1.org会自动跳转到http://www.site1.org(演示略)

四、将http重写至https

在非全站https时,对于有些敏感的数据需有走https,那也可以通过rewrite方式实现

如下示例,假定https://www.site1.org/user目录下包含敏感信息,按可按如下方式rewrite

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
location ^~ /user {
rewrite ^/ https://www.site1.org$request_uri? permanent;
}
全站https
server {
listen 80;
server_name site1.orag www.site1.org;
access_log /var/log/nginx/http-access.log;
error_log /var/log/nginx/http-error.log;
rewrite ^/ https://www.site1.org$request_uri;
}
上述演示略

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/leshami/article/details/78429250

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:详解Linux查看程序端口占用情况

2023-4-3 4:50:24

建站知识

小知识:Linux环境下python2.7.6升级python3.5.2

2023-4-3 4:58:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索