好的,所以我最近一直在使用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的模式相同。
为什么我的第一条规则完全不起作用?
答案 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重写规则与之匹配与否的原因,这是查看其工作原理与否的最佳来源,并删除大部分猜测工作。