将IIS URL重写规则转换为Kestrel Rewrite中间件规则遇问题求助
问题分析
你的代码仅实现了当前应用内部的路径重写(把/authxxx改成/xxx),但原IIS规则的核心是将请求反向代理到http://localhost:6000这个外部服务,Kestrel的AddRewrite本身不具备跨服务转发请求的能力,这就是代码达不到预期的根本原因。
解决方案
官方推荐用YARP(Yet Another Reverse Proxy)来实现反向代理需求,步骤如下:
- 安装YARP包
在项目根目录执行命令:
dotnet add package Microsoft.AspNetCore.Yarp
- 配置代理规则
在Program.cs中添加YARP服务和中间件:
var builder = WebApplication.CreateBuilder(args); // 注册YARP反向代理服务 builder.Services.AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); var app = builder.Build(); // 使用反向代理中间件 app.MapReverseProxy(); app.Run();
- 添加配置文件
在appsettings.json中配置路由和集群信息,完全匹配原IIS规则的行为:
{ "ReverseProxy": { "Routes": { "auth-proxy-route": { "ClusterId": "auth-service-cluster", "Match": { "Path": "/auth/{**catch-all}" }, "Transforms": [ { "PathRemovePrefix": "/auth" } ] } }, "Clusters": { "auth-service-cluster": { "Destinations": { "auth-service": { "Address": "http://localhost:6000/" } } } } } }
这个配置会把所有以/auth开头的请求(比如/auth/login)转发到http://localhost:6000/login,和原IIS规则的重写逻辑完全一致,且用户不会看到URL变化。
如果你的需求只是当前应用内的路径重写(请求仍在本应用处理),那原代码的问题是正则匹配逻辑错误——Kestrel的AddRewrite匹配的是包含开头斜杠的完整路径,修改代码即可:
var rewrite = new RewriteOptions().AddRewrite(@"^/auth(.*)", "/$1", false); app.UseRewriter(rewrite);
内容的提问来源于stack exchange,提问作者Wojciech Szabowicz
相关产品推荐
相关产品推荐

