You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将IIS URL重写规则转换为Kestrel Rewrite中间件规则遇问题求助

问题分析

你的代码仅实现了当前应用内部的路径重写(把/authxxx改成/xxx),但原IIS规则的核心是将请求反向代理到http://localhost:6000这个外部服务,Kestrel的AddRewrite本身不具备跨服务转发请求的能力,这就是代码达不到预期的根本原因。

解决方案

官方推荐用YARP(Yet Another Reverse Proxy)来实现反向代理需求,步骤如下:

  1. 安装YARP包
    在项目根目录执行命令:
dotnet add package Microsoft.AspNetCore.Yarp
  1. 配置代理规则
    在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();
  1. 添加配置文件
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:10:25