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

Yarp动态转发配置:如何自动为原主机追加.local后缀映射旧站点?

YARP自动追加.local后缀实现多客户站点映射方案

完全可以实现这个需求,不需要为每个站点单独配置appsettings.json,下面提供两种落地方式:


方式一:自定义请求转换(推荐)

通过YARP的请求转换能力,在转发请求时动态从当前请求的Host提取原域名,自动追加.local后缀作为目标地址的主机部分。

1. 修改Program.cs添加转换逻辑

builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"))
    .AddTransforms(context =>
    {
        // 提取当前请求的原始主机名(不含端口)
        var originalHost = context.HttpContext.Request.Host.Host;
        var targetHost = $"{originalHost}.local";

        // 替换代理请求的目标地址和Host头
        context.AddRequestTransform(transformContext =>
        {
            transformContext.ProxyRequest.RequestUri = new UriBuilder(transformContext.ProxyRequest.RequestUri)
            {
                Host = targetHost
            }.Uri;
            transformContext.ProxyRequest.Headers.Host = targetHost;
            return Task.CompletedTask;
        });
    });

2. 简化appsettings.json配置

只需要保留基础路由和集群结构,目标地址用占位符即可:

"ReverseProxy": {
  "Routes": {
    "route1": {
      "ClusterId": "cluster1",
      "Match": {
        "Path": "{**catch-all}"
      }
    }
  },
  "Clusters": {
    "cluster1": {
      "Destinations": {
        "placeholder": {
          "Address": "http://placeholder.local"
        }
      }
    }
  }
}

方式二:动态目标选择策略

如果需要更灵活的目标管理,可以实现自定义的目标选择策略,运行时动态生成对应.local后缀的目标地址。

1. 实现自定义策略类

public class DynamicLocalHostPolicy : IDestinationSelectorPolicy
{
    public string PolicyName => "DynamicLocalHost";

    public Task<IReadOnlyList<DestinationState>> SelectDestinationsAsync(
        HttpContext context, 
        RouteConfig route, 
        ClusterConfig cluster, 
        IReadOnlyList<DestinationState> destinations, 
        CancellationToken cancellationToken)
    {
        var originalHost = context.Request.Host.Host;
        var targetAddress = $"http://{originalHost}.local";

        // 动态生成目标节点
        var dynamicDest = new DestinationState("dynamic-local")
        {
            Address = new Uri(targetAddress)
        };

        return Task.FromResult<IReadOnlyList<DestinationState>>(new List<DestinationState> { dynamicDest });
    }
}

2. 注册策略并修改配置

在Program.cs中注册策略:

builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"))
    .AddPolicy<DynamicLocalHostPolicy>();

修改appsettings.json指定使用该策略:

"ReverseProxy": {
  "Routes": {
    "route1": {
      "ClusterId": "cluster1",
      "Match": {
        "Path": "{**catch-all}"
      }
    }
  },
  "Clusters": {
    "cluster1": {
      "DestinationSelectorPolicy": "DynamicLocalHost",
      "Destinations": {
        "placeholder": {
          "Address": "http://placeholder.local"
        }
      }
    }
  }
}

注意事项

  • 确保旧版ASP.NET MVC站点的IIS已绑定对应的customername.productname.com.local域名
  • 若使用HTTPS,需将代码中的http://替换为https://,并确保证书覆盖.local后缀的域名
  • 测试阶段可通过本地hosts文件配置域名映射,验证转发逻辑是否正常

内容的提问来源于stack exchange,提问作者Bug Maker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:42:42