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
相关产品推荐
相关产品推荐

