如何将/api/swagger路由从YARP反向代理中排除?
解决YARP反向代理排除Swagger静态资源路由的问题
问题核心在于:Swagger的静态资源(如swagger-ui.css、swagger-ui-bundle.js等)由Swagger中间件处理,不属于端点路由范畴。而你当前YARP配置中的{**catch-all}路由会匹配所有未被端点路由处理的请求,包括这些Swagger静态资源请求,导致它们被错误转发到前端服务。
只需让YARP优先排除/api/swagger/**路径的请求,不进行转发,留给Swagger中间件处理即可,以下是两种可行方案:
方案一:修改配置文件(推荐)
在appsettings.json的ReverseProxy配置中,添加一个优先级更高的路由规则,专门匹配/api/swagger开头的请求,且不指定转发集群,让请求继续向下流转给Swagger中间件:
"ReverseProxy": { "Routes": { "swagger-exclude-route": { "Order": 0, // 优先级高于catch-all路由(默认Order为100) "Match": { "Path": "/api/swagger/{**catch-all}" } }, "route1": { "ClusterId": "cluster1", "Match": { "Path": "{**catch-all}" } } }, "Clusters": { "cluster1": { "HttpClient": { "SslProtocols": [ "Tls12" ] }, "Destinations": { "cluster1/destination1": { "Address": "https://localhost:5173/" } } } } }
YARP的路由匹配按Order值从小到大优先匹配,swagger-exclude-route会先捕获所有/api/swagger开头的请求,由于该路由未配置ClusterId,YARP不会转发这些请求,而是交给后续的Swagger中间件处理。
方案二:代码中配置路由规则
如果不想修改配置文件,可以在代码中直接添加排除路由:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services .AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")) // 添加排除Swagger路径的路由规则 .AddRoute("swagger-exclude", routeBuilder => { routeBuilder .Order(0) .Match("/api/swagger/{**catch-all}") .NoCluster(); // 不指定转发集群,让请求继续向下 }); var app = builder.Build(); app.MapGet("/api/hello", () => "Hello World!"); app.UseSwagger(); app.UseSwaggerUI(options => { options.RoutePrefix = "api/swagger"; }); app.MapReverseProxy(); app.Run();
验证
修改完成后重启服务,访问https://localhost:5001/api/swagger,检查浏览器控制台,所有Swagger相关的静态资源请求(如swagger-ui.css)应返回200,不会被转发到前端服务https://localhost:5173。
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

