重写映射规则以匹配任何URL扩展

时间:2016-12-01 18:38:37

标签: regex url-rewriting iis-7 rewritemap

我是一个相当新的重写地图,但我们确实让我们的工作在一个非常基础的水平上。在网站重新设计之后,我们设置了一个广泛的重写映射(数千个规则)来将旧页面指向新页面。我们遇到的麻烦是我们必须为同一页面添加多个值才能使重写生效。

示例:

http://www.abc123.com/About  -->  http://www.abc123.com/about-us
http://www.abc123.com/About.aspx  -->  http://www.abc123.com/about-us
http://www.abc123.com/about/  -->  http://www.abc123.com/about-us
http://www.abc123.com/about.aspx  -->  http://www.abc123.com/about-us

应该有一种方法可以在正则表达式中的基本URL之后输入任何通配符 - 我期待这样的事情:^。 / [about] $如果所有这些都很棒网址包含"关于"但他们没有。

另请注意,我们不是按目录重定向,而是按文件名重定向。我们的CMS设置为不使用.aspx扩展名,因此任何扩展都可以使用。

我想要的是每个网址只需要一条规则,如下所示: " http://www.abc123.com/about"并且它将所有上述变体指向新URL,无论它是否没有扩展名,或者扩展名是.html,.asp,.aspx或.whatever

这是否超出了重写规则的能力,还是我缺少一些基本的正则表达式?

以下是我们使用的规则:

<rule name="Redirect Rule for Legacy Redirects" enabled="true" stopProcessing="true">
   <match url=".*" />
   <conditions>
        <add input="{Redirects:{REQUEST_URI}}" pattern="(.+)" />
  </conditions>
  <action type="Redirect" url="{C:1}" appendQueryString="false" />
</rule>

非常感谢任何见解。

2 个答案:

答案 0 :(得分:0)

[HH] [Tt的] [Tt的] [PP]://(([^ /]) /) [AA] [BB] [吴] [支原体] [Tt的]。 *

请参阅https://regex101.com/r/rZhJyz/1,只需将“about-us”附加到第1组比赛。

答案 1 :(得分:0)

今天必须弄清楚这一点。可以通过使用<match url>正则表达式来剥离扩展名,然后使用此处匹配的部分作为重写映射查找的输入来完成。

重写映射键不能以/开头。

规则(和示例图)看起来像这样,例如剥离.aspx扩展名的示例(可以概括):

    <rewrite>
        <rewriteMaps>
            <rewriteMap name="Test">
                <add key="test" value="http://www.google.com" />
                <add key="test.aspx" value="http://www.google.com" />
            </rewriteMap>
        </rewriteMaps>
        <rules>
            <rule name="Rewrite Map Optional Aspx Extension" stopProcessing="true">
                <match url="^(.*?)(\.aspx)?$" />
                <conditions>
                    <add input="{Test:{R:1}}" pattern="(.+)" />
                </conditions>
                <action type="Redirect" url="{C:1}" appendQueryString="false" />
            </rule>
        </rules>
    </rewrite>

与标准重写映射规则相比,重要的变化是:

  1. (\.aspx)?添加为匹配网址的可选部分,并且已将?添加到.*中,以使首字母.*不再贪婪,因此它不包括在内扩展名。
  2. {Test:{REQUEST_URI}}更改为{Test:{R:1}},以便它使用来自匹配URL (.*)的匹配输入
  3. 从改写的地图密钥中取出前导/