首页 > 解决方案 > 使用 IIS 重写映射进行多站点迁移

问题描述

我们有一个带有多个单独网站的服务器:

domain.com/masterSite    
domain.com/site1    
domain.com/site2    
domain.com/siteN

我们正在将多个单独的网站迁移到多租户应用程序 (/mastersite)。我们不是一下子做这一切的;相反,我们一次迁移单个站点(200 多个)。而当一个站点迁移到多租户站点时,我们需要一个转发规则。

例子:

domain.com/site1 --> domain.com/masterSite/site1
domain.com/siteN --> domain.com/masterSite/siteN

站点名称都是随机的,因此我们将使用 Rewrite Map。

问题是我在使用重写映射时无法确定模式匹配,因此无论额外的 URL 数据如何,对路径的所有请求都会被转发。

这是当前状态:

<rewrite>
      <rewriteMaps>
        <rewriteMap name="ForwardToMTDB" defaultValue="">
          <add key="/site1" value="/masterSite/site1" />
          <add key="/site2" value="/masterSite/site2" />
        </rewriteMap>
      </rewriteMaps>
      <rules>
        <rule name="Rewrite Rule" enabled="true" stopProcessing="true">
          <match url="(.+)" />
          <conditions>
            <add input="{ForwardToMTDB:{REQUEST_URI}}" pattern="(.+)" />
          </conditions>
          <action type="Redirect" url="{C:1}" logRewrittenUrl="true" redirectType="Found" />
        </rule>
      </rules>
    </rewrite>

应全部转到 domain.com/masterSite/siteN 的请求示例

domain.com/SiteN
domain.com/siteN/ 
domain.com/siteN/foo/bar
domain.com/siteN/somePage.aspx
domain.com/siteN/blah1/blah2/blah3/blah4/etc

标签: iisurl-rewrite-module

解决方案


所以,我得到了它的工作。这是规则:

 <rule name="Redirect Rule" enabled="true" stopProcessing="true">
      <match url="^(.+?)([/?$])" />
      <conditions logicalGrouping="MatchAny">
        <add input="{ForwardToMTDB:{R:1}}" pattern="(.+)" />
      </conditions>
      <action type="Redirect" url="{C:1}" appendQueryString="False" redirectType="Found" />
    </rule>

我还必须修改重写映射中的键值以排除前导斜杠:

<rewriteMap name="ForwardToMTDB" defaultValue="">
  <add key="site1" value="/masterSite/site1" />
  <add key="site2" value="/masterSite/site2" />
</rewriteMap>

我阅读了许多与我正在尝试的内容相关的帖子。例如,这篇文章谈到了匹配一个可选的斜杠。我不断地在 IIS 中使用测试模式工具在此基础上进行构建,直到我得到反向引用以始终是我需要的,而不管 URL 中的其他数据如何。


推荐阅读