我有以下重写规则:
<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&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
时)Member-Groups
(当我预期它为'子组'时)我还有其他一些较低级别的重写规则,例如:
<rewrite url="^/Membership/(.+)" to="/Membership/Index.aspx?f=$1"/>
<rewrite url="^/Membership/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$1&f=$2"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$2&f=$3"/>
他们将分别使用以下示例网址:
/Membership/Benefits.aspx
/Membership/Benefits/Member-Groups.aspx
/Membership/Benefits/Member-Groups/Sub-Groups.aspx
在这些情况下,会按预期生成FileName
和ParentFileName
值。只有在这个“第5级”页面上我才遇到问题。
我做错了什么?
修改
删除web.config中的所有重写规则后,除了以下内容:
<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&f=$4"/>
我发现它自己有效。然后我尝试将它们全部一个一个地添加回来并更改顺序直到它工作。我终于发现以下规则有效:
<rewrite url="^/Membership/(.+)" to="/Membership/Index.aspx?f=$1"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&f=$4"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$2&f=$3"/>
<rewrite url="^/Membership/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$1&f=$2"/>
所以只是颠倒顺序,除了我将第一条规则保持在同一位置。
答案 0 :(得分:3)
请尝试以下操作:
,而不是发布所有规则<rewrite url="^/Membership/([^/]+)$" to="/Membership/Index.aspx?f=$1"/>
<rewrite url="^/Membership/([^/]+/)*([^/]+)/([^/]+)$" to="/Membership/Index.aspx?parentf=$2&f=$3"/>
这应该避免规则歧义,并且具有任意路径深度的一般规则。
答案 1 :(得分:1)
替代解决方案
删除web.config中的所有重写规则后,除了以下内容:
<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&f=$4"/>
我发现它自己有效。然后我尝试将它们全部一个一个地添加回来并更改顺序直到它工作。我终于发现以下规则有效:
<rewrite url="^/Membership/(.+)" to="/Membership/Index.aspx?f=$1"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&f=$4"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$2&f=$3"/>
所以只是颠倒顺序,除了我将第一条规则保持在同一位置。
答案 2 :(得分:0)
重新排列您的规则,使用如此广泛的模式(.+)
,您应该从最长到最短开始:
<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&f=$4"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$2&f=$3"/>
<rewrite url="^/Membership/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$1&f=$2"/>
<rewrite url="^/Membership/(.+)" to="/Membership/Index.aspx?f=$1"/>
或者,如果oy想要保留当前订单,请将这些规则中出现的所有(.+)
替换为([^/]+)
。
问题是:此规则<rewrite url="^/Membership/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$1&f=$2"/>
将与这些网址的所有相匹配:
/Membership/Benefits/Member-Groups.aspx
/Membership/Benefits/Member-Groups/Sub-Groups.aspx
/Membership/Benefits/Member-Groups/Sub-Groups/Motorcycle-Live.aspx
如果您的当前订单中有规则(首先是“更短”),那么“更长”的规则将永远不会被评估。