我正在从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!
我做错了什么?
答案 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
(无复数)。确保这是你想要的。
-PATTERN_MATCH
模式/用户/([0-9] +?)
InputURL用户/ 1
否定虚假 匹配错误
注意缺少开头的斜线。
答案 1 :(得分:1)
您应分别使用<match url="/users/([0-9]+)" />
和<match url="/users/([a-z]+)" ignoreCase="true" />
来匹配完整的ID /用户,而不仅仅是他们的第一个字母/数字。但我不知道为什么你的正则表达式会在一个数字上失败,所以也必须有另一个问题。
关于你的第二个问题,我不确定我完全理解。如何区分文件夹名称和用户名?文件夹是否总是有一个斜杠?