YARP路由:Match-Path规则能否使用正则表达式匹配URL模式?
YARP中使用正则表达式匹配Path路径
可以实现,但YARP默认的Path匹配规则不直接支持标准正则语法,不过有两种可靠的方式满足你的需求:
方式一:利用ASP.NET Core路由的正则约束
YARP的路由系统基于ASP.NET Core路由,可在路由模板中使用正则约束模拟你需要的匹配规则。比如要匹配/api/\w{1,3}-\d{1,9}这类路径,配置如下:
"Routes": { "RegexPathRoute": { "Match": { "Path": "/api/{segment:regex(^\\w{1,3}-\\d{1,9}$)}" }, "ClusterId": "YourTargetCluster" } }
注意:JSON字符串中的反斜杠需要转义,所以正则里的\w要写成\\w,\d写成\\d。这种方式适合单路径段的正则匹配,配置简单,无需额外代码。
方式二:自定义路径匹配策略
如果需要更复杂的正则匹配逻辑(比如多路径段组合、动态正则规则),可以通过实现YARP的IMatchPolicy扩展匹配逻辑:
- 创建自定义匹配策略类:
public class RegexPathMatchPolicy : IMatchPolicy { public int Order => 100; // 设置优先级,确保在默认策略之前执行 public bool Matches(HttpContext httpContext, RouteConfig route, RouteMatch match) { var regexPattern = route.Match.Path; if (string.IsNullOrEmpty(regexPattern)) return false; var requestPath = httpContext.Request.Path.Value; return Regex.IsMatch(requestPath, regexPattern, RegexOptions.IgnoreCase); } }
- 在Program.cs中注册服务:
builder.Services.AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")) .AddMatchPolicy<RegexPathMatchPolicy>();
- 配置文件中直接写正则表达式:
"Routes": { "CustomRegexRoute": { "Match": { "Path": "^/api/\\w{1,3}-\\d{1,9}$" }, "ClusterId": "YourTargetCluster" } }
注意事项
- 自定义匹配策略的
Order属性需合理设置,避免和默认匹配逻辑冲突 - 使用正则约束时,路由模板中的占位符名称(比如示例中的
segment)仅作为标识,不影响匹配逻辑 - 两种方式都无需使用
{**catch-all},可精准实现宽泛或具体的正则路径匹配
内容的提问来源于stack exchange,提问作者user3154653
相关产品推荐
相关产品推荐

