使用URLRewriter.NET重写可包含1或2个查询字符串的URL?

时间:2009-02-22 14:39:00

标签: .net asp.net web-config url-rewriting urlrewriter.net

在我的项目中,我的/PropertDetail.aspx可以获得2个查询字符串。

PropertyId /PropertDetail.aspx?PropertyId=5

的第一个第一个

第二一个用于语言/PropertDetail.aspx?PropertyId=5&Language=2

编辑:,此页面可以获取其中一个或者可以同时获取它们,因此我的重写规则需要同时处理它们

所以,我已将这些规则设置为web.config

<rewriter>
        <rewrite url="^(/.+(\.gif|\.png|\.jpg|\.ico|\.pdf|\.css|\.js)(\?.+)?)$" to="$1" processing="stop" />
        <rewrite url="^/(.+)-(.+).aspx$" to="/PropertyDetail.aspx?PropertyId=$2" processing="stop"/>
        <!--http://localhost:1562/Harika-Gayrimenkul-5.aspx-->
        <rewrite url="^/(.+)-(.+)-(.+).aspx$" to="/PropertyDetail.aspx?PropertyId=$2&#038;Language=$3" processing="stop"/>
        <!--http://localhost:1562/Great-Property-5-2.aspx-->
</rewriter>

如果没有语言查询字符串就可以了,但是当有一个语言查询字符串时,它会将第三个表达式作为 PropertyId 而不是语言

如何为同一页面定义这两个规则?

谢谢

3 个答案:

答案 0 :(得分:3)

综合答案:

<rewriter>
    <rewrite url="^(/.+(\.gif|\.png|\.jpg|\.ico|\.pdf|\.css|\.js)(\?.+)?)$" to="$1" processing="stop"/>
    <rewrite url="^.+?([\d]+?)-([\d]+?)\.aspx$" to="/PropertyDetail.aspx?PropertyId=$1&amp;Language=$2" processing="stop"/>
    <rewrite url="^.+?-([\d]+?)\.aspx$" to="/PropertyDetail.aspx?PropertyId=$1" processing="stop"/>

</rewriter>

对于许多组合而言,现在效果很好:

/This-is-a-really-long-property-title-555-12

返回PropertyId = 555和Language = 12.

/This-is-another-really-long-property-title-666

返回PropertyId = 666。

答案 1 :(得分:2)

通过添加问号,使匹配中的第二个参数(语言值)可选:

编辑:这是一个更正后的版本,是在我意识到我误解了这个问题之后做出的。

<rewriter>
  <rewrite url="\.(?:gif|png|jpg|ico|pdf|css|js)(?:\?.*)?$" to="$0" processing="stop"/>
  <rewrite url="(\d+)(?:-?(\d+)?)\.aspx$" to="/PropertyDetail.aspx?PropertyId=$1&amp;Language=$2" processing="stop"/>
</rewriter>

这是OP工作的清理和简化版本。它将以

的形式产生输出
/PropertyDetail.aspx?PropertyId=12345&Language=1   (when language is present)
/PropertyDetail.aspx?PropertyId=12345&Language=    (when it isn't)

请注意

  • 使用$ 0反向引用来引用整个输入字符串,而不需要实际匹配整个输入字符串
  • 使用非捕获组(?:...)来处理我们不需要存储在匹配组中的事情,因为我们不想在以后检索它们的值
  • 将单参数和双参数URL的单独规则合并为单个规则

答案的原始版本:

<rewriter>
  <rewrite url="^/(.+?)-(.+?)-?(.+?)?\.aspx$" to="/PropertyDetail.aspx?PropertyId=$2&amp;#038;Language=$3" processing="stop"/>
</rewriter>

答案 2 :(得分:1)

这是我们提出的最终解决方案。

<rewriter>
    <rewrite url="^(/.+(\.gif|\.png|\.jpg|\.ico|\.pdf|\.css|\.js)(\?.+)?)$" to="$1" processing="stop"/>
    <rewrite url="^.+?([\d]+?)-([\d]+?)\.aspx$" to="/PropertyDetail.aspx?PropertyId=$1&amp;Language=$2" processing="stop"/>
    <rewrite url="^.+?-([\d]+?)\.aspx$" to="/PropertyDetail.aspx?PropertyId=$1" processing="stop"/>
</rewriter>
  • 第一条规则是关于文件类型 我们不需要。
  • 第二条规则是“如果页面获得2 查询字符串“
  • 第三条规则是关于页面是否获得 只有一个查询字符串

非常感谢您的帮助 teknohippy JasonMArcher