借助IIS URL Rewrite实现.NET API无文件夹路径统一域名访问
我帮你整理了几个靠谱的解决方案,针对你在IIS下部署两个.NET API、想要去掉URL里service1/service2前缀的需求:
方案一:正确配置URL Rewrite + ARR反向代理(最推荐)
你之前尝试URL Rewrite没成功,大概率是没搭配ARR(Application Request Routing)模块——因为要把根站点的请求转发到子应用,单纯的重写规则不够,需要反向代理支持。
步骤1:安装必要模块
首先确保IIS上安装了URL Rewrite和**Application Request Routing (ARR)**模块,可以通过IIS的「Web平台安装程序」搜索安装。
步骤2:开启ARR代理功能
- 打开IIS管理器,选中左侧的服务器节点(不是站点)。
- 找到并打开「Application Request Routing Cache」。
- 在右侧操作栏点击「Server Proxy Settings」,勾选「Enable proxy」,然后点击「应用」保存。
步骤3:配置根站点的Rewrite规则
在根站点(Default Web Site)的web.config中添加以下规则,把/api/ONE/**转发到/service1/api/ONE/**,/api/TWO/**转发到/service2/api/TWO/**:
<configuration> <system.webServer> <rewrite> <rules> <!-- 转发带路径的service1请求,比如 /api/ONE/123 --> <rule name="Forward to Service1" stopProcessing="true"> <match url="^api/ONE/(.*)" /> <action type="Rewrite" url="/service1/api/ONE/{R:1}" /> </rule> <!-- 转发不带路径的service1根请求,比如 /api/ONE --> <rule name="Forward to Service1 Root" stopProcessing="true"> <match url="^api/ONE$" /> <action type="Rewrite" url="/service1/api/ONE" /> </rule> <!-- 转发带路径的service2请求,比如 /api/TWO/abc --> <rule name="Forward to Service2" stopProcessing="true"> <match url="^api/TWO/(.*)" /> <action type="Rewrite" url="/service2/api/TWO/{R:1}" /> </rule> <!-- 转发不带路径的service2根请求,比如 /api/TWO --> <rule name="Forward to Service2 Root" stopProcessing="true"> <match url="^api/TWO$" /> <action type="Rewrite" url="/service2/api/TWO" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
配置完成后,访问http://mydomain/api/ONE就会内部转发到/service1/api/ONE,用户看不到中间的子应用路径。
方案二:调整API项目的路由前缀(代码层面适配)
如果不想依赖IIS的模块,也可以修改两个API项目的路由配置,让它们的路由前缀直接对应api/ONE和api/TWO,再配合简单的Rewrite规则:
步骤1:修改service1的路由配置
在service1的Program.cs中,调整API的路由前缀:
// 替换原有路由配置,直接指定完整前缀 app.MapControllerRoute( name: "default", pattern: "api/ONE/{controller=Home}/{action=Index}/{id?}"); // 如果用属性路由,统一修改控制器上的路由特性: // [Route("api/ONE/[controller]")] // public class OneController : ControllerBase { ... }
同理,修改service2的路由前缀为api/TWO。
步骤2:根站点的简化Rewrite规则
这时候根站点的Rewrite规则和方案一一致,但不需要ARR也能生效(因为只是路径重写,不是跨站点代理)。
方案三:合并应用程序池(可选,适合小型项目)
如果两个API的技术栈一致、依赖冲突少,也可以把它们合并成一个.NET项目,或者部署在同一个应用程序池下的根站点,直接配置不同的路由前缀api/ONE和api/TWO,这样就不需要任何Rewrite规则了。不过这个方案需要调整项目结构,适合愿意重构的场景。
内容的提问来源于stack exchange,提问作者Danny Su




