IIS:在默认网站之外使用应用程序请求路由进行URL重写

IIS:在默认网站之外使用应用程序请求路由进行URL重写,iis,url-rewriting,Iis,Url Rewriting,我想在重写子域的IIS中重写URL。例如: www.mycompany.com/api/v1.0被重写为api1.mycompany.com www.mycompany.com/api/v2.0被重写为api2.mycompany.com 请注意,我想重写而不是重定向,换句话说,浏览器中的URL仍然是www.mycompany.com/api/v1.0和www.mycompany.com/api/v2.0 任何不符合上述模式的请求都应继续由www.mycompany.com处理 我的理解是U

我想在重写子域的IIS中重写URL。例如:

  • www.mycompany.com/api/v1.0
    被重写为
    api1.mycompany.com
  • www.mycompany.com/api/v2.0
    被重写为
    api2.mycompany.com
请注意,我想
重写
而不是
重定向
,换句话说,浏览器中的URL仍然是
www.mycompany.com/api/v1.0
www.mycompany.com/api/v2.0

任何不符合上述模式的请求都应继续由
www.mycompany.com
处理

我的理解是URL重写2.0模块本身不足以实现这一点,因此我安装了应用程序请求路由3.0。下面是我尝试执行的web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="false" />
        <rewrite>
            <rules>
                <rule name="API v1.0" stopProcessing="true">
                    <match url="^api/v1.0/(.*)$" />
                    <action type="Rewrite" url="http://api1.mycompany.com/{R:1}" />
                </rule>
                <rule name="API v2.0" stopProcessing="true">
                    <match url="^api/v2.0/(.*)$" />
                    <action type="Rewrite" url="http://api2.mycompany.com/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

一旦我安装了应用程序请求路由,我就能够让它工作,但前提是
www.mycompany.com
是IIS的
默认网站。换句话说,仅当IIS设置为:

  • 默认网站(
    www.mycompany.com
    • 此网站的web.config如上图所示
  • api1.mycompany.com
  • api2.mycompany.com
我的问题是
www.mycompany.com
不能是
默认网站
(默认网站由服务器上的另一个网站保留)
www.mycompany.com
只是另一个网站,就像
api1.mycompany.com
api2.mycompany.com
。如果
www.mycompany.com
不是默认的
网站,有没有办法让它正常工作?像这样的

  • 默认网站(其他一些非相关网站)
  • www.mycompany.com
    • 此网站的web.config如上图所示
  • api1.mycompany.com
  • api2.mycompany.com

如果可以更改
C:\Windows\System32\inetsrv\config\applicationHost.config
config文件,则可以将重写配置放入其中

我在本地测试,它在IIS8和ARR 3.0下工作

我的applicationHost.config文件如下所示:



几周前我就想这么做。我不确定URL重写2.0是否可以完成。在我看来,请求首先被传递到重写模块,然后根据映射被传递到同一应用程序池中的新句柄。如果URL重写需要将请求传递到另一台计算机或在应用程序池之间,它将无法按您希望的方式工作。我建议将这个问题变得更一般一些,以防在IIS上使用其他工具可以实现您想要的功能。我把这个问题投了赞成票,因为我仍然希望我是错的:D你能在C:\Windows\System32\inetsrv\config\applicationHost.config上做些更改吗?@CyrilDurand你能详细说明一下需要在applicationHost.config上做些什么更改吗?我试过了你所有的步骤,但都没能成功。直接访问api2.mycompany.com/books是可行的,但试图通过www.mycompany.com/api/v2.0/books访问却不行,我得到了404响应。您的示例中的www.company.com是否在IIS中设置为“默认网站”(即IIS中默认设置的网站)?@johnyoshika不是,但我重试了一次,效果相同,我还编辑了我的答案。可能应用程序在url中检查某些内容失败(ASP.net路由)。你能试着使用一些简单的资源,比如
index.html
,看看它是否有效吗?哇,当你使用简单的html文件时,它就有效了。在.Net中一定有东西路由错误。非常感谢。我试过使用MVC和WebAPI应用程序,效果很好。你的应用程序对URL有什么特别之处吗?尝试使用IIS失败的请求跟踪,可能会有所帮助。同时尝试设置断点,也许您会发现未修补的异常。谢谢您的建议,@Cyril Durand。我们的主要应用程序是MVC,我们的API是WebAPI,我不认为我们对URL做了什么特别的事情,但我可能弄错了,因为我们的应用程序在过去几年中已经发展得相当大了。我会试试你的建议,看看哪里出了问题。