【问题标题】:Intelligencia UrlRewriter with RegEx is not working带有 RegEx 的 Intelligencia UrlRewriter 无法正常工作
【发布时间】:2011-07-21 23:00:34
【问题描述】:

我有以下重写规则:

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

它们将分别使用以下示例 URL:

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

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

【问题讨论】:

  • 如果你使用^/Membership/([^/]+)/([^/]+)/([^/]+)/([^/]+)会得到什么?
  • @Qtax 谢谢,有可能我会试试!
  • @QTax 没试过,结果一样
  • 可能是你的其他重写规则之一。你自己测试这个重写吗?您应该这样做,或者您可以尝试将所有其他. 更改为[^/],并在所有规则的末尾添加$。 (尽管奇怪的是你得到了一个,/ 是,所以可能是别的东西。)
  • @Qtax 是的,我刚刚尝试删除除该规则之外的所有规则并且它有效。所以是的,它必须与其他规则之一有关。只是不确定是哪一个!我已经尝试过切换顺序,但这似乎又造成了另一个问题!

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


【解决方案1】:

试试这个,而不是你发布的所有规则:

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

这应该避免规则的歧义,并且对于任意路径深度有一个通用的规则。

【讨论】:

  • 太好了,谢谢!我只是要回来发布我找到的解决方案,但你的更好!我仍然会用我的替代方案编辑我上面的问题,但我会使用你的。谢谢。
  • 不客气。如果您有其他解决方案,也可以将其作为另一个答案发布在这里,也许它甚至会获得一些选票。 :-)
【解决方案2】:

替代解决方案

在我的 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"/>

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    如果您有当前顺序的规则(“较短”优先),“较长”的规则将永远不会被评估。

    【讨论】:

    • 我已经尝试了你的建议。我重新排列了顺序,但随后我得到 'Index.aspx?parentf=Sub-Groups,Motorcycle-Live.aspx' 作为 FileName 而没有作为 ParentFileName。
    • 另外,正如您在上面对@Qtax 的评论中可能已经注意到的那样,我已经尝试交换“。” '[^/]' 的字符,但这没有区别!
    • @Leah 我已经在正则表达式测试工具上尝试了该模式,并使用 IIS URL Rewrite 模块实现了这一点——它工作正常——我在发布之前已经对其进行了测试。 没有办法当这个模式^/Membership/(.+)/(.+)/(.+)/(.+) 与这个 URL /Membership/Benefits/Member-Groups/Sub-Groups/Motorcycle-Live.aspx 匹配时会产生这样的结果。只有在另一个规则处理它时才有可能。 我强烈建议重新启动您的应用程序/IIS/服务器或检查您拥有的其他规则。我的回答描述了原因,对此我是 100% 肯定的。
    • 感谢您的帮助。也许是因为它在我的本地机器上运行,而不是使用 IIS。重写规则直接添加到我的 web.config 中,而不是使用服务器的 URL 重写模块。但是,当该站点上线时,我将通过服务器上的 IIS URL 重写模块重新添加规则,因为我被告知 Intelligencia UrlRewriter 不适用于 IIS7。所以也许当它上线时它会很好。但即使是这样,为什么它在我的本地机器上不起作用?
    • @Leah 不幸的是,我无法对 Intelligencia UrlRewriter 发表评论——以前从未听说过。无论如何——这些规则必须被重写才能被 IIS URL 重写模块使用。你有哪个操作系统?如果是 Windows Vista 或 Windows 7,那么您可以轻松地在您的 PC 上安装 IIS v7 并从那里运行。你试过重启吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多