Frage IIS: Verwenden Sie das Anwendungsanforderungs-Routing für den URL-Rewrite außerhalb der Standardwebsite


Ich möchte eine URL in IIS neu schreiben, wo Sub-Domain neu geschrieben wird. Beispielsweise:

  • www.mycompany.com/api/v1.0 wird umgeschrieben api1.mycompany.com
  • www.mycompany.com/api/v2.0 wird umgeschrieben api2.mycompany.com

Beachten Sie, dass ich möchte rewrite und nicht redirectMit anderen Worten, die URL im Browser bleibt bestehen www.mycompany.com/api/v1.0 und www.mycompany.com/api/v2.0.

Jede Anfrage, die nicht zu den obigen Mustern passt, sollte weiter verarbeitet werden www.mycompany.com.

Mein Verständnis ist die URL Rewrite 2.0-Modul allein ist nicht genug, um dies zu ermöglichen, so installierte ich Application Request Routing 3.0. Hier ist die web.config für was ich versuche zu tun:

<?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>

Nachdem ich das Application Request Routing installiert hatte, konnte ich das zum Laufen bringen, aber nur, wenn www.mycompany.com ist der Default Website für IIS. Mit anderen Worten, nur wenn IIS wie folgt eingerichtet ist:

  • Standardwebsite (www.mycompany.com)
    • Die web.config für diese Site ist oben gezeigt
  • api1.mycompany.com
  • api2.mycompany.com

Mein Problem ist das www.mycompany.com kann nicht sein Default Website (Die Standardwebsite ist von einer anderen Site auf dem Server reserviert). www.mycompany.com ist nur eine andere Website genau wie api1.mycompany.com oder api2.mycompany.com. Gibt es irgendeinen Weg, um dies ohne zu arbeiten? www.mycompany.com das sein Default Website? Etwas wie das?

  • Standard-Website (einige andere nicht verwandte Website)
  • www.mycompany.com
    • Die web.config für diese Site ist wie oben gezeigt
  • api1.mycompany.com
  • api2.mycompany.com

6
2018-05-11 06:16


Ursprung


Antworten:


Wenn Sie das ändern können C:\Windows\System32\inetsrv\config\applicationHost.config Konfigurationsdatei, können Sie Ihre Rewrite-Konfiguration in sie einfügen.

Ich teste lokal und es funktioniert unter IIS8 und ARR 3.0.

IIS configuration

Application Request Routing configuration

Meine applicationHost.config-Datei sieht folgendermaßen aus:

<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>

Final result


3
2018-05-20 16:01