基于同一路径用Yarp代理子应用,如何保留IIS主应用访问?
解决Yarp反向代理中主应用请求直接由IIS处理的配置方案
核心思路
要避免递归重定向,关键是让IIS和Yarp监听不同端口,Yarp将未匹配SideApps规则的请求转发到IIS的专属端口,而非直接转发到Yarp自身监听的80端口。
步骤1:调整IIS绑定端口
将原IIS上的MainApp网站绑定到非80端口(比如8080),确保Yarp(监听80)和IIS无端口冲突,同时避免转发递归。调整后MainApp的内部访问地址变为http://localhost:8080/MainApp。
步骤2:配置Yarp路由规则
在Yarp项目的appsettings.json中添加以下配置:
{ "ReverseProxy": { "Routes": { // SideApps子应用转发规则,优先匹配 "SideAppRoute": { "ClusterId": "SideAppCluster", "Match": { "Path": "/MainApp/SideApps/{appName}/{**catch-all}" }, "Transforms": [ { "PathRemovePrefix": "/MainApp/SideApps/{appName}" }, { "RequestHeader": "Host", "Set": "localhost" } ] }, // 默认路由,处理所有未匹配的MainApp请求 "MainAppRoute": { "ClusterId": "MainAppCluster", "Match": { "Path": "{**catch-all}" } } }, "Clusters": { "SideAppCluster": { "Destinations": { "App1": { "Address": "http://localhost:5001/" }, "App2": { "Address": "http://localhost:5002/" } }, "LoadBalancingPolicy": "AppNameMatchPolicy" }, "MainAppCluster": { "Destinations": { "MainApp": { "Address": "http://localhost:8080/" } } } } } }
步骤3:实现自定义负载均衡策略(匹配appName到对应子应用)
添加自定义策略用于根据路由中的appName匹配对应端口的子应用:
public class AppNameMatchPolicy : ILoadBalancingPolicy { public Task<DestinationState> PickDestinationAsync(HttpContext context, ClusterState cluster, CancellationToken cancellationToken) { var appName = context.Request.RouteValues["appName"]?.ToString(); var targetDest = cluster.Destinations.FirstOrDefault(d => d.Key.Equals(appName, StringComparison.OrdinalIgnoreCase)).Value; if (targetDest == null) { throw new InvalidOperationException($"未找到对应子应用: {appName}"); } return Task.FromResult(targetDest); } }
在Program.cs中注册该策略:
builder.Services.AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")) .AddLoadBalancingPolicy<AppNameMatchPolicy>("AppNameMatchPolicy");
关键说明
- 路由规则优先级:SideApps规则优先于默认路由,确保子应用请求先被匹配转发。
- 路径转换:
PathRemovePrefix会移除代理前缀,让子应用接收到正确的路径(比如/MainApp/SideApps/App1/api/data会被转发到http://localhost:5001/api/data)。 - 端口隔离:IIS和Yarp分端口监听是避免递归重定向的核心,否则转发MainApp请求会再次进入Yarp形成循环。
内容的提问来源于stack exchange,提问作者wexman
相关产品推荐
相关产品推荐

