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

基于同一路径用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:50:59