【问题标题】:Rewrite Map Rule to match any URL extension重写映射规则以匹配任何 URL 扩展
【发布时间】:2017-04-16 12:41:33
【问题描述】:

我对重写地图还很陌生,但我们确实让我们的工作在非常基本的层面上工作。网站重新设计后,我们建立了一个广泛的重写地图(数千条规则),将旧页面指向新页面。我们遇到的麻烦是我们必须为同一页面添加多个值才能使重写工作。

例子:

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]$ 如果包含所有 url,那就太好了“关于”,但他们没有。

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

我想要的是只需要为每个 URL 设置一个规则,如下所示: “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>

任何见解将不胜感激。

【问题讨论】:

  • 我承认我不知道什么是 rewitemap 但你可以试试match url=".+about$"
  • 正则表达式应该匹配哪些输入?正则表达式不应该匹配哪些输入?

标签: regex url-rewriting iis-7 rewritemap


【解决方案1】:

[Hh][Tt][Tt][Pp]://(([^/])/)[Aa][Bb][Oo][Uu][Tt]。 *

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

【讨论】:

  • 我不能这么具体,因为在我们的重写映射中有数千个重定向,而且大多数都不是“关于”的,但可能是任何东西。大多数情况下,我想知道是否有办法不必为 URL 的每种情况编写特定规则。在上面的示例中,这意味着编写 1 条规则来覆盖这些配置中的每一个,而不是 4 条。
【解决方案2】:

今天必须解决这个问题。可以通过使用&lt;match url&gt; 正则表达式去除扩展名,然后使用此处的匹配部分作为重写映射查找的输入来完成。

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

规则(和示例图)如下所示,剥离 .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}},因此它使用来自匹配网址(.*) 的匹配输入
  3. 从重写映射键中取出前导/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2018-11-01
    • 2018-04-13
    • 2012-03-18
    • 2011-08-10
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多