IIS URL重写ASP.NET MVC 5中子域路由的规则

时间:2016-09-07 15:01:31

标签: asp.net-mvc iis multi-tenant url-rewrite-module

我有一个用ASP.NET MVC 5编写的Web应用程序,其中包含有关其用户的信息。现在,我想为每个可作为我网站子域名的用户创建一个个人资料页面(例如user1.example.comuser2.example.com,...)。

我希望可以通过HTTP访问这些子域,而应用程序的其余部分必须要求使用HTTPS。

我在IIS上运行Web应用程序,所以我认为最好是使用URL重写规则将user1.example.com重写为example.com/Profile/Index?name=user1,因此Web应用程序本身不必知道关于正在使用的子域名。我想出了这些重写规则:

<rewrite>
  <rules>
    <clear />
    <rule name="Rewrite user subdomains into query string" stopProcessing="true">
      <match url="^(.+)" />
      <conditions>
        <add input="{HTTP_HOST}" negate="true" pattern="^www\.example\.com$" />
        <add input="{HTTP_HOST}" pattern="^([^.]+)\.example\.com$" />
      </conditions>
      <action type="Rewrite" url="/Profile/Index?name={C:1}" />
    </rule>
    <rule name="Redirect to https without www" stopProcessing="true">
      <match url="(.*)" />
      <conditions trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="^www\.example\.com$" />
        <add input="{HTTP_HOST}" pattern="^example\.com$" />
      </conditions>
      <action type="Redirect" url="https://example.com/{R:1}" redirectType="Permanent" />
    </rule>
  </rules>
</rewrite>

遗憾的是,此代码不会将user1.example.com重写为example.com/Profile/Index?name=user1并强制HTTPS甚至超过user1.example.com

有人请向我解释为什么以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我最终使用了这段代码:

<rewrite>
  <rules>
    <clear />
    <rule name="Rewrite url with tenant subdomain" stopProcessing="true">
      <match url="^$" /> <!-- So resources like user1.example.com/Content/css wouldn't be affested by this rewrite -->
      <conditions>
        <add input="{HTTP_HOST}" negate="true" pattern="^www\.example\.com$" />
        <add input="{HTTP_HOST}" pattern="^([^.]+)\.example\.com$" />
      </conditions>
      <action type="Rewrite" url="Profile/Index?subdomain={C:1}" />
    </rule>
    <rule name="Redirect to www.example.com" stopProcessing="true">
      <match url="(.*)"/>
      <conditions>
        <add input="{HTTP_HOST}" pattern="^example\.com$"/>
      </conditions>
      <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" />
    </rule>
    <rule name="Redirect to https" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTPS}" pattern="^OFF$" />
      </conditions>
      <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" />
    </rule>
  </rules>
</rewrite>

让我感到困惑的是,事实上,索引模板中的Url助手开始抛出System.Web.HttpException: Cannot use a leading .. to exit above the top directory.因为它是我需要特定租户的唯一页面,所以我放弃了,硬编码链接和一切开始工作正常。