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

我创建了 2 条规则:

<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 或者 …/用户/foo)并且不在真正的 IIS 上!

我做错了什么?

有帮助吗?

解决方案

明显的问题是您当前的正则表达式仅匹配用户名中的一个字符或一个数字。您需要在括号内添加一个加量词,以便匹配多个字母或数字。看 这一页 有关正则表达式量词的更多信息。请注意,您不会匹配“/users/”等纯 URL(无 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>

请注意,您选择的是 Users.aspx 对于这些 URL 之一和 User.aspx (无复数)另一个。确保这就是您的意图。

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

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

请注意缺少开头斜杠。

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top