关于正则表达式:如何重定向子文件夹以在 Mod Rewrite for IIS 7.0 中查询?

How to redirect subfolder to query in Mod Rewrite for IIS 7.0?

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

  • http://example.com/users/foo 到 http://example.com/User.aspx?name=foo
  • http://example.com/users/1 到 http://example.com/User.aspx?id=1

我创建了两条规则:

1
2
3
4
5
6
7
8
<rule name="ID">
   <match url="/users/([0-9])" />
   
</rule>
<rule name="Name">
   <match url="/users/([a-z])" ignoreCase="true" />
   
</rule>

它通过了一个测试到 iis mmc 测试对话框,但没有在调试中(URL 像 http://localhost:9080/example.com/users/1 或 …/users/foo)并且没有真正的IIS!

我做错了什么?


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

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

1
2
3
4
5
6
7
8
<rule name="ID">
    <match url="^users/([0-9]+)" />
   
</rule>
<rule name="Name">
    <match url="^users/([a-z]+)" ignoreCase="true" />
   
</rule>

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

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

-PATTERN_MATCH
Pattern /users/([0-9]+?)
InputURL users/1
Negate false
Matched false

注意缺少开头的斜线。


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

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