Nginx-路径重写
wenking 8/22/2023 nginx
# rewrite指令
定义: 该指令通过正则表达式的使用来改变URI。可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理 语法: rewrite regex replacement [flag];
flag主要有一下几种选择:
- permanent: 永久重定向,返回状态码为301, 浏览器将缓冲重定向响应头中指定的 Location 的 url, 下次请求直接发送到新的 url
- redirect: 临时重定向,返回状态码为302,浏览器会跳转到响应头中指定的 Location 的 url, 但不会缓存重定向信息,下次访问任然会再次重定向
- break: 将重写后的 uri 作为新的 uri, 继续在当前的 location 模块中执行
- last: 将重写后的 uri 作为新的 uri,终止在本 location 中处理,并重写在 server 块中执行
# break 和 last
后端服务存在两个接口 /
和 /err
, 其中 /
返回正常数据, /err
返回异常数据
- 使用break配置
server {
listen 8084;
server_name localhost;
# 对于所有访问 http://localhost:8084/err 都将代理到 http://localhost:8080/下面:
location /err {
proxy_pass http://localhost:8080/;
}
# 对于所有 访问 /rw/err* 都将重定向到 /err 路径下
location / {
rewrite ^/rw/(err).*$ /$1 break;
proxy_pass http://localhost:8080;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
现在开始访问: http://localhost:8084/rw/errqaz flag 为 break:那么将得到如下结果:
{"code":500,"msg":"操作异常","data":null}
1
可见,该 location 直接修改请求路径为: http://localhost:8084/err, 然后继续匹配 proxy_pass 配置
- 将 break 修改为 last,配置如下
server {
listen 8084;
server_name localhost;
# 对于所有访问 http://localhost:8084/err 都将代理到 http://localhost:8080/下面:
location /err {
proxy_pass http://localhost:8080/;
}
# 对于所有 访问 /rw/err* 都将重定向到 /err 路径下
location / {
rewrite ^/rw/(err).*$ /$1 last;
proxy_pass http://localhost:8080;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
现在开始访问: http://localhost:8084/rw/errqaz flag 为 last:那么将得到如下结果:
{"code":200,"msg":"操作成功","data":null}
1
可见,该 location 直接修改请求路径为: http://localhost:8084/err, 然后重新进入 server 块开始匹配, 匹配到 第一个
location /err
然后返回
- 通过 last 和 break 匹配, 浏览器 Location 地址栏的 url 不会发生改变, 任然是发送请求时的 url
- last 和 break 可以类比 tomcat 的转发(forward),都是在服务端进行的
# permanent 和 redirect
使用nginx临时重定向redirect配置
server {
listen 8084;
server_name localhost;
location / {
rewrite ^/rw/(err).*$ /$1 redirect;
proxy_pass http://localhost:8080;
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
每次请求都会返回重定向响应,然后跳转到Location, 响应不会被缓存
使用nginx永久重定向permanent配置
server {
listen 8084;
server_name localhost;
location / {
rewrite ^/rw/(err).*$ /$1 permanent;
proxy_pass http://localhost:8080;
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
第一次请求结果:
第二次请求结果:
- 通过 permanent 和 redirect 匹配, 浏览器 Location 地址栏的 url 会发生改变,改变内容为重写后的 url
- permanent 和 redirect 可以类比 tomcat 的重定向(redirect),将链接返回给客户端然后重写 请求 url