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

Regex 如何在IIS 7.0的Mod Rewrite中将子文件夹重定向到查询?,regex,iis,iis-7,rewrite,Regex,Iis,Iis 7,Rewrite,我正在从IIS.net使用IIS 7.0的Mod Rewrite,并希望重定向请求: foo到?name=foo 1到?id=1 我创建了两条规则: <rule name="ID"> <match url="/users/([0-9])" /> <action type="Rewrite" url="/User.aspx?id={R:1}" /> </rule> <rule name="Name"> <mat

我正在从IIS.net使用IIS 7.0的Mod Rewrite,并希望重定向请求:

  • foo到?name=foo
  • 1到?id=1
我创建了两条规则:

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

或者…/users/foo),而不是在真正的IIS上

我做错了什么?

您应该分别使用
,以匹配完整的id/用户,而不仅仅是他们的第一个字母/数字。但我不知道为什么你的正则表达式会在一个位数上失败,所以肯定还有另一个问题

至于你的第二个问题,我不确定我是否完全理解。如何区分文件夹名和用户名之间的区别?文件夹是否始终具有尾随斜杠?

您应该分别使用
,以匹配完整的id/用户,而不仅仅是他们的第一个字母/数字。但我不知道为什么你的正则表达式会在一个位数上失败,所以肯定还有另一个问题


至于你的第二个问题,我不确定我是否完全理解。如何区分文件夹名和用户名之间的区别?文件夹是否始终具有尾随斜杠?

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

您遇到的另一个问题是IIS从初始斜杠后的第一个字符开始计算重写规则。因此,匹配
/users/([0-9])
的规则将不匹配任何内容,因为当正则表达式求值时,URL看起来像
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>

. 这使得诊断非常容易。我能够发出测试请求,并通过跟踪查找每个重写规则的评估位置(在跟踪的“模式匹配”部分中)。对于其中一个规则的特定模式匹配,我看到了以下内容:

-模式匹配
模式/用户/([0-9]+?)
输入URL用户/1
否定错误
匹配错误


请注意缺少开头斜杠。

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

您遇到的另一个问题是IIS从初始斜杠后的第一个字符开始计算重写规则。因此,您的规则必须匹配
/users/([0-9])
不会匹配任何内容,因为在进行正则表达式求值时,URL看起来像
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>

。这使得诊断变得非常容易。我能够发出测试请求并查看跟踪,以找到每个重写规则的评估位置(位于跟踪的“模式匹配”部分)。对于某个规则的特定模式匹配,我看到了以下内容:

-模式匹配
模式/用户/([0-9]+?)
输入URL用户/1
否定错误
匹配错误


请注意缺少开头斜杠。

+1用于查找错误正则表达式之外的基本问题:)+1用于查找错误正则表达式之外的基本问题:)