如何将子文件夹重定向到Mod Rewrite for IIS 7.0中的查询?

时间:2009-03-10 21:28:14

标签: regex iis iis-7 rewrite

我正在从iis.net使用Mod Rewrite for IIS 7.0并想要重定向请求:

我创建了两条规则:

<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!

我做错了什么?

2 个答案:

答案 0 :(得分:2)

显而易见的问题是,您当前的正则表达式只匹配用户名中的一个字符或一个数字。您需要在括号内添加加号量词,以匹配多个字母或数字。有关正则表达式量词的详细信息,请参阅this page。请注意,您不会匹配“/ users /”之类的普通URL(无ID或名称)。确保这是你想要的。

您遇到的另一个问题是IIS从初始斜杠后的第一个字符开始评估重写规则。因此,匹配/users/([0-9])的规则与任何内容都不匹配,因为在进行正则表达式评估时,网址看起来像users/foo而不是/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,为另一个网址选择User.aspx(无复数)。确保这是你想要的。

顺便说一句,我想出这些事情的方式是使用IIS Failed Request Tracing to troubleshoot rewrite rules。这使得诊断非常简单。我能够发出一个测试请求,并查看跟踪以找到每个重写规则的评估位置(它位于跟踪的一部分名为“PATTERN_MATCH”。对于您的一个规则的特定PATTERN_MATCH,我看到了:< / p>
  

-PATTERN_MATCH
  模式/用户/([0-9] +?)
  InputURL用户/ 1
  否定虚假   匹配错误

注意缺少开头的斜线。

答案 1 :(得分:1)

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

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