使用 rewrite
指令解决 Nginx 路径重写问题
在使用 Nginx 作为反向代理服务器时,经常会遇到需要对请求路径进行重写的情况。例如,当后端服务升级后,新服务的接口路径发生了变化,而前端页面仍然使用旧的接口路径时,可以通过 Nginx 的 rewrite
指令来解决路径不匹配的问题 。本文将详细介绍如何使用 rewrite
指令来去掉请求路径中的 /new
前缀,并将请求正确转发到后端服务。
背景
假设你有两个服务,分别运行在端口 2343 和 2344。新服务(端口 2344)升级后,新增了一些接口,但这些接口的路径与老服务(端口 2343)不一致。前端页面需要使用新接口,但后端服务在接收数据时多了一个 /new
路径。为了解决这个问题,我们可以通过 Nginx 的 rewrite
指令来去掉 /new
前缀。
Nginx 配置步骤
1. 定义后端服务的 upstream
首先,定义两个后端服务的 upstream
模块,分别指向老服务和新服务的地址和端口。
nginxupstream old_service { server 127.0.0.1:2343; # 老服务的地址和端口 } upstream new_service { server 127.0.0.1:2344; # 新服务的地址和端口 }
2. 使用 map
指令区分请求
使用 map
指令根据请求路径将请求路由到不同的后端服务。如果请求路径以 /new
开头,使用新服务;否则使用老服务。
nginxmap $request_uri $backend { ~^/new(.*)$ new_service; # 如果请求路径以 /new 开头,使用新服务 default old_service; # 其他请求使用老服务 }
3. 配置 server
块
在 server
块中,使用 rewrite
指令去掉 /new
前缀,然后将请求转发到后端服务。
nginxserver { listen 80; server_name your-domain.com; location / { # 去掉 /new 前缀后再转发请求 rewrite ^/new(.*)$ $1 break; proxy_pass http://$backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
配置说明
-
upstream
模块old_service
:老服务的地址和端口(例如127.0.0.1:2343
)。new_service
:新服务的地址和端口(例如127.0.0.1:2344
)。
-
map
指令~^/new(.*)$
:正则表达式匹配以/new
开头的请求路径。new_service
:如果请求路径以/new
开头,使用新服务。default old_service
:其他请求使用老服务。
-
rewrite
指令^/new(.*)$
:正则表达式匹配以/new
开头的请求路径。$1
:捕获的路径部分,去掉/new
前缀。break
:停止处理后续的rewrite
指令。
-
proxy_pass
指令http://$backend
:将请求转发到map
指令中定义的后端服务。proxy_set_header
:设置请求头信息,确保后端服务能够正确处理请求。
测试配置
-
测试新接口
bashcurl http://your-domain.com/new/your-new-interface
- 请求应被转发到新服务(端口 2344),并且路径中的
/new
前缀被去掉。
- 请求应被转发到新服务(端口 2344),并且路径中的
-
测试老接口
bashcurl http://your-domain.com/your-old-interface
- 请求应被转发到老服务(端口 2343)。
-
查看 Nginx 日志
-
查看 Nginx 错误日志:
bashtail -f /var/log/nginx/error.log
-
查看 Nginx 访问日志:
bashtail -f /var/log/nginx/access.log
-
-
查看后端服务日志
- 查看新服务和老服务的日志,确认请求是否正确转发。
注意事项
-
确保后端服务能够正确处理请求路径
- 如果后端服务需要
/new
前缀,可以忽略此问题。 - 如果后端服务不需要
/new
前缀,确保在 Nginx 中正确去掉前缀。
- 如果后端服务需要
-
测试配置
-
使用
nginx -t
命令测试配置文件的语法是否正确。 -
重新加载 Nginx 配置:
bashsudo systemctl reload nginx
-
-
检查 Nginx 日志
-
查看 Nginx 错误日志:
bashtail -f /var/log/nginx/error.log
-
查看 Nginx 访问日志:
bashtail -f /var/log/nginx/access.log
-
-
检查后端服务日志
- 查看后端服务的日志,确认请求是否正确转发。
总结
通过使用 Nginx 的 rewrite
指令,可以轻松解决请求路径中多出 /new
前缀的问题。这种方法不仅配置简单,而且性能较好,适合在生产环境中使用。希望本文能够帮助你更好地理解和使用 Nginx 的 rewrite
指令,解决实际工作中的问题。