Url重写奇怪的url匹配行为

时间:2015-09-08 10:54:19

标签: .net regex iis rewrite iis-8

好的,所以我最近一直在使用IIS Url Rewrite并且发现它很棒,但是我遇到了一些令人困惑的行为。

首先让我告诉你我想要完成的事情:

/{word1}/{id}-{word2}

301 to

/{newWord1}/{id}-{word2}

现在让我告诉你我第一次尝试的规则:

        <rule name="Hub Page Redirect" stopProcessing="true">
            <match url="/service/([0-9]+)\-([^/]+/?)$" />
            <action type="Redirect" url="/hubs/{R:1}-{R:2}" />
        </rule>

正如您所看到的,我只匹配特定的网址结构,然后使用匹配中的某些捕获组重定向到自定义网址。这仅适用于以下结构(下面的示例):

/service/1460-berkshire

在最后添加斜线时,它不起作用?但是,当我将规则更改为以下内容时:

        <rule name="Hub Page Redirect" stopProcessing="true">
            <match url=".*" />
            <conditions>
                <add input="{URL}" pattern="/service/([0-9]+)\-([^/]+/?)$" />
            </conditions>
            <action type="Redirect" url="/hubs/{C:1}-{C:2}" />
        </rule>

一切正常吗?我所做的只是匹配只匹配任何匹配的特定网址,然后通过条件匹配。条件模式与我最初用于匹配URL的模式相同。

为什么我的第一条规则完全不起作用?

1 个答案:

答案 0 :(得分:2)

确实{URL}和匹配网址之间存在一些不一致 它失败的原因是,当您请求&#34;根URI&#34;时,前导斜杠&#34; /&#34;在匹配URL属性中,它不包括在内,例如您对/ service / 1460-berkshire的请求,发送RequestURL =&#34; service / 1460-berkshire&#34;,因此由于领先而不匹配&#34; /&#34;在你的正则表达式。如果你总是希望它是根,那么最好的规则(性能和清晰度)将是:

<rule name="Hub Page Redirect" stopProcessing="true">
    <match url="^service/([0-9]+)\-([^/]+/?)$" />
    <action type="Redirect" url="/hubs/{R:1}-{R:2}" />
</rule>

您在根目录中指定的方式,并且将更快地匹配该网址。

在你的第二条规则中,它通过了ExpandedInput =&#34; / service / 1460-berkshire&#34;那么这个条件实际上与它匹配。

我对人们的建议是使用“失败请求跟踪”来查看URL重写规则与之匹配与否的原因,这是查看其工作原理与否的最佳来源,并删除大部分猜测工作。

请参阅:http://www.iis.net/learn/extensions/url-rewrite-module/using-failed-request-tracing-to-trace-rewrite-rules