You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

借助IIS URL Rewrite实现.NET API无文件夹路径统一域名访问

解决方案:IIS下移除API子应用路径的URL访问配置

我帮你整理了几个靠谱的解决方案,针对你在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代理功能

  1. 打开IIS管理器,选中左侧的服务器节点(不是站点)。
  2. 找到并打开「Application Request Routing Cache」。
  3. 在右侧操作栏点击「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/ONEapi/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/ONEapi/TWO,这样就不需要任何Rewrite规则了。不过这个方案需要调整项目结构,适合愿意重构的场景。


内容的提问来源于stack exchange,提问作者Danny Su

火山引擎 最新活动