IIS web.config重写:移除URL中指定子目录
解决YARP代理场景下移除URL指定子目录的问题
你的核心问题在于:用IIS重写规则处理后端.NET Framework站点是无效的,因为请求先经过YARP代理层,后端站点的规则无法影响外部访问的URL。正确的做法是在YARP所在的.NET Core代理站点中处理路径转换或重定向。
根据你的需求(将带/web/前缀的URL转为不带该前缀的形式),提供两种适配场景的解决方案:
场景1:后端站点无需/web/前缀
如果后端.NET Framework站点本身可以直接处理不带/web/的路径,只需要将外部带/web/的请求重定向到不带的URL即可:
步骤1:在代理站点的Program.cs中添加重写中间件
using Microsoft.AspNetCore.Rewrite; var builder = WebApplication.CreateBuilder(args); // 注册YARP服务 builder.Services.AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); var app = builder.Build(); // 添加重定向规则:匹配/web/开头的路径,永久跳转到去掉/web/的路径 var rewriteOptions = new RewriteOptions() .AddRedirect("^web/(.*)", "/$1", 301); app.UseRewriter(rewriteOptions); // 启用YARP代理 app.MapReverseProxy(); app.Run();
步骤2:配置YARP的appsettings.json
保持基础转发配置即可:
"ReverseProxy": { "Routes": { "defaultRoute": { "ClusterId": "frameworkSite", "Match": { "Path": "{**catch-all}" } } }, "Clusters": { "frameworkSite": { "Destinations": { "site1": { "Address": "https://你的.NET Framework站点地址/" } } } } }
场景2:后端站点必须接收带/web/的路径
如果后端站点只能处理带/web/前缀的请求,需要同时做重定向(外部URL去前缀)+ 路径转换(代理时补前缀):
步骤1:Program.cs中的重写规则和场景1一致
同样添加AddRedirect规则,确保外部URL去掉/web/。
步骤2:修改YARP的appsettings.json,添加路径转换
"ReverseProxy": { "Routes": { "defaultRoute": { "ClusterId": "frameworkSite", "Match": { "Path": "{**catch-all}" }, "Transforms": [ // 将代理请求的路径转为/web/{原路径},适配后端站点的需求 { "PathPattern": "/web/{**catch-all}" } ] } }, "Clusters": { "frameworkSite": { "Destinations": { "site1": { "Address": "https://你的.NET Framework站点地址/" } } } } }
这样用户访问www.mysite.com/web/Login时,会先被重定向到www.mysite.com/Login,同时YARP会将该请求转发到后端的/web/Login路径,既满足URL美观性,又保证后端能正确处理请求。
内容的提问来源于stack exchange,提问作者Gustavo Mauricio De Barros
相关产品推荐
相关产品推荐

