使用RegEx的Intelligencia UrlRewriter无法正常工作

时间:2011-07-21 12:10:03

标签: .net asp.net regex url-rewriting

我有以下重写规则:

<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&amp;f=$4"/>
我期待的

应该使用此URL:

/Membership/Benefits/Member-Groups/Sub-Groups/Motorcycle-Live.aspx

但是,在我的页面中,这个重写的URL映射到(/Membership/Index.aspx),我正在检索FileName(我的查询字符串中的“f”)和ParentFileName(“parentf”)在我的查询字符串中)在查询中使用以获取当前页面信息。

  • 在这种情况下FileName的值为Sub-Groups,Motorcycle-Live.aspx(当我预期它只是Motorcycle-Live.aspx时)
  • 在这种情况下,'ParentFileName'的值为Member-Groups(当我预期它为'子组'时)

我还有其他一些较低级别的重写规则,例如:

<rewrite url="^/Membership/(.+)" to="/Membership/Index.aspx?f=$1"/>
<rewrite url="^/Membership/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$1&amp;f=$2"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$2&amp;f=$3"/>

他们将分别使用以下示例网址:

/Membership/Benefits.aspx
/Membership/Benefits/Member-Groups.aspx
/Membership/Benefits/Member-Groups/Sub-Groups.aspx

在这些情况下,会按预期生成FileNameParentFileName值。只有在这个“第5级”页面上我才遇到问题。

我做错了什么?


修改

删除web.config中的所有重写规则后,除了以下内容:

<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&amp;f=$4"/>

我发现它自己有效。然后我尝试将它们全部一个一个地添加回来并更改顺序直到它工作。我终于发现以下规则有效:

<rewrite url="^/Membership/(.+)" to="/Membership/Index.aspx?f=$1"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&amp;f=$4"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$2&amp;f=$3"/>
<rewrite url="^/Membership/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$1&amp;f=$2"/>

所以只是颠倒顺序,除了我将第一条规则保持在同一位置。

3 个答案:

答案 0 :(得分:3)

请尝试以下操作:

,而不是发布所有规则
<rewrite url="^/Membership/([^/]+)$" to="/Membership/Index.aspx?f=$1"/>
<rewrite url="^/Membership/([^/]+/)*([^/]+)/([^/]+)$" to="/Membership/Index.aspx?parentf=$2&amp;f=$3"/>

这应该避免规则歧义,并且具有任意路径深度的一般规则。

答案 1 :(得分:1)

替代解决方案

删除web.config中的所有重写规则后,除了以下内容:

<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&amp;f=$4"/>

我发现它自己有效。然后我尝试将它们全部一个一个地添加回来并更改顺序直到它工作。我终于发现以下规则有效:

<rewrite url="^/Membership/(.+)" to="/Membership/Index.aspx?f=$1"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&amp;f=$4"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$2&amp;f=$3"/>

所以只是颠倒顺序,除了我将第一条规则保持在同一位置。

答案 2 :(得分:0)

重新排列您的规则,使用如此广泛的模式(.+),您应该从最长到最短开始:

<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&amp;f=$4"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$2&amp;f=$3"/>
<rewrite url="^/Membership/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$1&amp;f=$2"/>
<rewrite url="^/Membership/(.+)" to="/Membership/Index.aspx?f=$1"/>

或者,如果oy想要保留当前订单,请将这些规则中出现的所有(.+)替换为([^/]+)

问题是:此规则<rewrite url="^/Membership/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$1&amp;f=$2"/>将与这些网址的所有相匹配:

/Membership/Benefits/Member-Groups.aspx
/Membership/Benefits/Member-Groups/Sub-Groups.aspx
/Membership/Benefits/Member-Groups/Sub-Groups/Motorcycle-Live.aspx

如果您的当前订单中有规则(首先是“更短”),那么“更长”的规则将永远不会被评估。