【问题标题】:Rewriting a Url which can contain 1 or 2 querystrings with URLRewriter.NET?使用 URLRewriter.NET 重写可以包含 1 或 2 个查询字符串的 Url?
【发布时间】:2010-10-09 04:02:34
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 我离得更近了,看看吧。但请注意这可能无意中匹配的其他内容。

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


【解决方案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>

现在很多组合都很好用:

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

返回 PropertyId=555 和 Language=12。

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

返回 PropertyId=666。

【讨论】:

  • 没有成功。但是有一点我忘了提,字符串的长度可能更像 Great-Property-For-People 当我使用上面的规则时,我的查询字符串得到 PropertyId="Great-Estate-5-2"跨度>
  • 只是测试它。发现它工作不正常。那么所需的 id 之前的破折号数量是可变的吗?
  • Great-Estate-5-2 房产标题=Great Estate |属性 ID=5 | LanguageId=2
  • 你去试试为我工作的新的。现在也不止一位,因为我假设您的 ID 将超过 10 :)
  • :) 非常感谢,我已经尝试过了,当我有 2 个查询字符串(propertyId 和语言)时没问题,但如果我只有 PropertyId 查询字符串,我会收到错误消息。说找不到 404 的源。可能是什么原因:/
【解决方案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>

【讨论】:

  • 这就是我要找的东西,但我收到一条错误消息 System.ArgumentException: "^/(.+?)-(.+?)-?(.+?+)?\.aspx $
  • 不同数量的破折号仍然会造成麻烦。
  • 关于参数异常:可能需要转义反斜杠(双反斜杠而不是一个)?
  • 现在异常消失了,但现在无法获取查询字符串。感谢您的时间和精力。可能是什么问题,你有没有使用过 urlrewriter.net 组件
【解决方案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>
  • 第一条规则是关于文件类型的 我们不需要。
  • 第二条规则是关于“如果页面获得 2 查询字符串”
  • 第三条规则是关于如果页面获取 只有一个查询字符串

非常感谢您对 teknohippyJasonMArcher 的帮助

【讨论】:

  • @Barbaros Alp:我想我有点误读了你原来的问题,我以为你有 三个 参数。您可以将第二条和第三条规则合并为一条:
  • 至少如果您不介意“语言”参数最后总是那里,虽然有时是空的。
  • 哦,我已经相应地更新了我的答案。并不是说它在这一点上会有很大的不同,但我不想让它不正确。 ;-)
  • 非常感谢Tomalak,我已经检查了你的答案,非常感谢你的帮助。
猜你喜欢
  • 2011-05-14
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 2020-06-04
  • 2016-02-12
  • 2015-01-23
  • 2012-10-22
  • 1970-01-01
相关资源
最近更新 更多