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

Joh*_*ika 6 iis url-rewriting

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

  • www.mycompany.com/api/v1.0 被改写为 api1.mycompany.com
  • www.mycompany.com/api/v2.0 被改写为 api2.mycompany.com

请注意,我想rewrite,不redirect,换句话说,在浏览器的URL仍然www.mycompany.com/api/v1.0www.mycompany.com/api/v2.0.

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

我的理解是仅凭URL Rewrite 2.0模块不足以实现这一点,所以我安装了Application Request Routing 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>
Run Code Online (Sandbox Code Playgroud)

一旦我安装了应用程序请求路由,我就可以使用它,但前提www.mycompany.com是它Default Website适用于IIS.换句话说,仅当IIS设置为如此:

  • 默认网站(www.mycompany.com)
    • 此站点的web.config如上所示
  • api1.mycompany.com
  • api2.mycompany.com

我的问题是www.mycompany.com不能Default Website(默认网站由服务器上的另一个站点保留). www.mycompany.com只是另一个网站就像api1.mycompany.comapi2.mycompany.com.有没有办法得到这个工作不www.mycompany.com作为Default Website?像这样的东西?

  • 默认网站(另一个非相关网站)
  • www.mycompany.com
    • 此站点的web.config如上所示
  • api1.mycompany.com
  • api2.mycompany.com

Cyr*_*and 5

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

我在本地测试,它可以在IIS8和ARR 3.0下运行。

IIS配置

应用程序请求路由配置

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

<system.webServer>
    <rewrite>
        <rules>
            <rule name="API v1.0" stopProcessing="true">
                <match url="^api/v1.0/(.*)$" />
                <action type="Rewrite" url="http://api1.company.com/{R:1}" />
            </rule>
            <rule name="API v2.0" stopProcessing="true">
                <match url="^api/v2.0/(.*)$" />
                <action type="Rewrite" url="http://api2.company.com/{R:1}" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

<!-- ... --->

<webFarms>
    <applicationRequestRouting>
        <hostAffinityProviderList>
            <add name="Microsoft.Web.Arr.HostNameRoundRobin" />
            <add name="Microsoft.Web.Arr.HostNameMemory" />
        </hostAffinityProviderList>
    </applicationRequestRouting>
</webFarms>

<!-- ... --->

<system.applicationHost>
    <sites>
        <site name="Default Web Site" id="1" serverAutoStart="true">
            <application path="/">
                <virtualDirectory path="/" physicalPath="%SystemDrive%\inetpub\wwwroot" />
            </application>
            <bindings>
                <binding protocol="http" bindingInformation="*:80:" />
            </bindings>
        </site>
        <site name="company.com" id="2">
            <application path="/" applicationPool="company.com">
                <virtualDirectory path="/" physicalPath="C:\tmp\company.com\www" />
            </application>
            <bindings>
                <binding protocol="http" bindingInformation="*:80:www.company.com" />
            </bindings>
        </site>
        <site name="api1.company.com" id="3">
            <application path="/" applicationPool="api1.company.com">
                <virtualDirectory path="/" physicalPath="C:\tmp\company.com\api1" />
            </application>
            <bindings>
                <binding protocol="http" bindingInformation="*:80:api1.company.com" />
            </bindings>
        </site>
        <site name="api2.company.com" id="4">
            <application path="/" applicationPool="api2.company.com">
                <virtualDirectory path="/" physicalPath="C:\tmp\company.com\api2" />
            </application>
            <bindings>
                <binding protocol="http" bindingInformation="*:80:api2.company.com" />
            </bindings>
        </site>
    </sites>
</system.applicationHost>
Run Code Online (Sandbox Code Playgroud)

最后结果