0

我正在使用来自 iis.net 的 Mod Rewrite for IIS 7.0 并希望重定向请求:

我创建了 2 条规则:

<rule name="ID">
   <match url="/users/([0-9])" />
   <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
   <match url="/users/([a-z])" ignoreCase="true" />
   <action type="Rewrite" url="/User.aspx?name={R:1}" />
</rule>

它通过测试进入 iis mmc 测试对话框,但不在调试中(URL 像http://localhost:9080/example.com/users/1.../users/foo)并且不在真正的 IIS 上!

我做错了什么?

4

2 回答 2

2

明显的问题是您当前的正则表达式仅匹配用户名中的一个字符或一个数字。您需要在括号内添加一个加号量词以匹配多个字母或数字。有关正则表达式量词的更多信息,请参阅此页面。请注意,您不会匹配像“/users/”这样的普通 URL(没有 ID 或名称)。确保这是您想要的。

您遇到的另一个问题是 IIS 从初始斜杠后的第一个字符开始评估重写规则。因此,您要匹配的规则/users/([0-9])不会匹配任何内容,因为当正则表达式评估发生时,URL 看起来像users/foonot /users/foo。解决方案是在模式的开头使用^(这是表示“字符串开头”的正则表达式字符)而不是斜杠。像这样:

<rule name="ID">
    <match url="^users/([0-9]+)" />
    <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
    <match url="^users/([a-z]+)" ignoreCase="true" />
    <action type="Rewrite" url="/Users.aspx?name={R:1}" />
</rule>

请注意,您选择Users.aspx其中一个 URL 并选择另一个User.aspx(非复数形式)。确保这是您想要的。

顺便说一句,我解决这些问题的方法是使用IIS Failed Request Tracing 对重写规则进行故障排除。这使得诊断变得非常容易。我能够发出测试请求并查看跟踪以找到正在评估每个重写规则的位置(它位于跟踪的一个名为“PATTERN_MATCH”的部分中。对于您的一个规则的特定 PATTERN_MATCH,我看到了这个:

-PATTERN_MATCH
模式 /users/([0-9]+?)
InputURL users/1 否定
false
匹配 false

请注意缺少开头的斜线。

于 2010-03-06T12:49:52.253 回答
1

您应该分别使用<match url="/users/([0-9]+)" /><match url="/users/([a-z]+)" ignoreCase="true" />来匹配完整的 id/用户,而不仅仅是他们的第一个字母/数字。但我不知道为什么你的正则表达式会在一位数上失败,所以肯定还有另一个问题。

至于你的第二个问题,我不确定我是否完全理解。如何区分文件夹名和用户名?文件夹总是有斜杠吗?

于 2010-03-06T12:06:48.580 回答