Nginx-路径重写

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

现在开始访问: 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

现在开始访问: 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

每次请求都会返回重定向响应,然后跳转到Location, 响应不会被缓存

nginx临时重定向解析结果

使用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

第一次请求结果: nginx永久重定向第一次请求解析结果

第二次请求结果: nginx永久重定向第二次请求解析结果

  • 通过 permanent 和 redirect 匹配, 浏览器 Location 地址栏的 url 会发生改变,改变内容为重写后的 url
  • permanent 和 redirect 可以类比 tomcat 的重定向(redirect),将链接返回给客户端然后重写 请求 url