07 Nginx Rewrite 跳转规则与实践


Rewrite 基本概述

  1. rewrite 主要实现 url 地址重写, 以及重定向.

Rewrite使⽤场景:

1
2
3
4
1. URL访问跳转: 支持开发设计, 页面跳转, 兼容性支持, 展示效果
2. SEO优化: 依赖于url路径,以便⽀持搜索引擎录入
3. 维护: 后台维护, 流量转发等
4. 安全: 伪静态,真实动态页面进行伪装

Rewrite 配置语法

正则表达式

正则表达式 终端测试工具

1
2
3
4
5
6
7
8
9
10
11
[root@proxy ~]# yum install -y pcre-tools
[root@proxy ~]# pcretest
PCRE version 8.32 2012-11-30

re> /(\d+)\.(\d+)\.(\d+)\.(\d+)/
data> 192.168.1.100
0: 192.168.1.100
1: 192
2: 168
3: 1
4: 100

Rewrite 标记Flag

break 与 last

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
[root@proxy conf.d]# vim rewrite.conf 

server {
listen 80;
server_name 60.205.217.112;
root /soft/code;

location ~ ^/break {
rewrite ^/break /test/ break;
}

location ~ ^/last {
rewrite ^/last /test/ last;
}

location /test {
default_type application/json;
return 200 '{"status":"success"}';
}

}

[root@proxy conf.d]# nginx -t
[root@proxy conf.d]# nginx -s reload

http://60.205.217.112/test/
1
测试 break

1
测试 last

last 与 break 对比总结

1
2
3
4
5
last 会新建一个请求  请求 域名+/test
http://60.205.217.112/last -> http://60.205.217.112/test

break匹配后不会进行匹配,会查找对应root站点目录下包含的/test目录,由于我没有test目录 就报错了
http://60.205.217.112/break -> http://60.205.217.112/test 得有/test目录

redirect 与 permanent

1
2
3
4
5
6
7
8
9
10
11
12
[root@proxy conf.d]# vim rewrite.conf

server {
listen 80;
server_name 60.205.217.112;
root /soft/code;

location ~ ^/bgx {
rewrite ^/bgx http://kt.xuliangwei.com redirect; # 302 临时跳转 关闭nginx后 不会跳转
rewrite ^/bgx http://kt.xuliangwei.com permanent; # 301 永久跳转 关闭nginx后 还可以跳转,客户端浏览器需要清理缓存
}
}

Rewrite 使用场景

重写URL地址

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@proxy conf.d]# mkdir -p /soft/code/course/11/22
[root@proxy conf.d]# echo "<h1>Nginx</h1>" >> /soft/code/course/11/22/course_33.html
[root@proxy conf.d]# vim rewrite.conf

server {
listen 80;
server_name 60.205.217.112;
index index.html;

location / {
root /soft/code;
}
}
1
2
# 路径较深
http://60.205.217.112/course/11/22/course_33.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 跳转 正则匹配
[root@proxy 22]# vim /etc/nginx/conf.d/rewrite.conf

server {
listen 80;
server_name 60.205.217.112;
root /soft/code;
index index.html;

location / {
rewrite ^/course-(\d+)-(\d+)-(\d+)\.html /course/$1/$2/course_$3.html break;
}
}

# 如果有人输入 /course-(数字)-(数字)-(数字)\.html
# 会被转化成 /course/$1/$2/course_$3.html 页面

http://60.205.217.112/course-11-22-33.html
->
http://60.205.217.112/course/11/22/course_33.html

实现跳转

1
2
3
if ($http_user_agent ~* Chrome){
rewrite ^/nginx http://kt.xuliangwei.com/index.html redirect;
}

Rewrite 额外补充

1
2
3
4
5
# Rewrite 匹配优先级

1. 执⾏server块的rewrite指令
2. 执⾏location匹配
3. 执⾏选定的location中的rewrite
1
# Rewrite 优雅书写