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 从初始斜杠后的第一个字符开始评估重写规则。因此,匹配
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 选择
顺便说一句,我解决这些问题的方法是使用 IIS Failed Request Tracing 对重写规则进行故障排除。这使得诊断变得非常容易。我能够发出测试请求并查看跟踪以找到正在评估每个重写规则的位置(它位于跟踪的一个名为"PATTERN_MATCH"的部分中。对于您的一个规则的特定 PATTERN_MATCH,我看到了这个:
-PATTERN_MATCH
Pattern /users/([0-9]+?)
InputURL users/1
Negate false
Matched false
注意缺少开头的斜线。
您应该分别使用
关于你的第二个问题,我不确定我是否完全理解。如何区分文件夹名和用户名?文件夹是否总是有斜杠?