3

在我的项目中,我的 /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而不是语言

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

谢谢

4

3 回答 3

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。

于 2009-02-22T14:57:09.243 回答
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(存在语言时)
/PropertyDetail.aspx?PropertyId=12345&Language=(如果不是)

笔记

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

答案的原始版本:

<rewriter>
  <rewrite url="^/(.+?)-(.+?)-?(.+?)?\.aspx$" to="/PropertyDetail.aspx?PropertyId=$2&amp;#038;Language=$3" processing="stop"/>
</rewriter>
于 2009-02-22T15:32:29.143 回答
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 个查询字符串”
  • 第三条规则是关于页面是否只有一个查询字符串

非常感谢您的帮助teknohippyJasonMArcher

于 2009-02-22T20:42:08.383 回答