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


3

在我的项目中,我的/PropertDetail.aspx可以获得2个querystrings。

一个是属性ID /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> 

它是一切OK了,如果没有语言查询字符串,但是当有一个语言的查询字符串它获得的第3表达式作为属性ID而不是语言

我如何定义这两条规则同一页?

感谢

  0

我有更多的距离,看一看。请注意,这可能会无意中匹配。 22 2月. 092009-02-22 16:57:41

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 

返回属性ID = 555和语言= 12。

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

返回PropertyId = 666。

  0

它没有解决。但有一件事我忘记了,字符串的长度可能更像是Great-Property-For-People 当我使用上面的规则时,我的查询字符串获取PropertyId =“Great-Estate-5-2” 22 2月. 092009-02-22 15:12:50

  0

只是测试它。发现它工作不正确。 所以在所需的ID之前破折号的数量是可变的? 22 2月. 092009-02-22 15:23:59

  0

Great-Estate-5-2 Property Title = Great Estate | PropertyId = 5 | LanguageId = 2 22 2月. 092009-02-22 15:32:38

  0

你去尝试新的为我工作。 现在还有一个以上的数字,因为我假设你的ID将达到10以上:) 22 2月. 092009-02-22 15:52:42

  0

:)非常感谢你,我已经尝试过了,它可以当我有2 querystrings(propertyId和语言)但如果​​我只是只有PropertyId querystring我得到一个错误。说什么来源无法找到404.什么原因:/ 22 2月. 092009-02-22 18:23:01

  0

现在我的问题是与该网址 /Great-Property-10 如果只有一个查询字符串有问题,但如果有两个查询字符串它工作的很好 22 2月. 092009-02-22 18:46:16

  0

@Barbaros,采取什么teknohippy并添加第三个重写规则到最后:<rewrite url =“^。+? - ([\ d] +?)\。aspx $”to =“/ PropertyDetail。 aspx?PropertyId = $ 1“处理=”停止“/> 22 2月. 092009-02-22 19:16:27

  0

@Barbaros,在这种情况下的未来引用404意味着没有任何规则匹配任何规则。 22 2月. 092009-02-22 19:26:28

  0

非常感谢teknohippy对你的帮助,JasonMArcher对于最后的金色镜头:)添加<rewrite url =“^。+? - ([\ d] +?)\。aspx $”to =“/ PropertyDetail.aspx? PropertyId = $ 1“处理=”停止“/>作为第三条规则做了诀窍 22 2月. 092009-02-22 20:35:32

  0

@teknohippy,请您将此作为第三条规则添加,我会将其标记为答案。 <rewrite url =“^。+? - ([\ d] +?)\。aspx $”to =“/ PropertyDetail.aspx?PropertyId = $ 1”processing =“stop”/> 22 2月. 092009-02-22 20:36:18


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> 
  0

这就是我要找的,我得到一个错误,说System.ArgumentException:“^ /(。+?) - (。+?) - ?(。+?+)?\。aspx $ 22 2月. 092009-02-22 15:37:16

  0

仍然不同数量的破折号会导致麻烦。 22 2月. 092009-02-22 15:45:38

  0

关于参数异常:也许反斜杠需要被转义(双反斜杠,而不是一个)? 22 2月. 092009-02-22 15:53:42

  0

现在异常消失了,但是现在不能得到querystrings了,谢谢你的时间和精力。曾经使用过urlrewriter。净组件 22 2月. 092009-02-22 18:25:11


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> 
  • 第1章是关于文件类型 我们不需要。
  • 第二个规则是关于“如果网页获得2 查询字符串”
  • 第三规则是有关在页面得到 只有一个查询字符串

非常感谢您对您的帮助teknohippyJasonMArcher

  0

@Barbaros Alp:我想我误解了你原来的一个问题,我以为你有三个*参数。你可以将第二条和第三条规则合并为一条:<rewrite url =“^。+?(\ d +)(?: - (\ d +))?\。aspx $”to =“/ PropertyDetail.aspx?PropertyId = $ 1 &amp; Language = $ 2“processing =”stop“/> 23 2月. 092009-02-23 00:21:20

  0

至少如果你不介意”Language“参数最终总是* there *,尽管有时是空的。 23 2月. 092009-02-23 00:22:56

  0

哦,我已经相应地更新了我的答案。这并不是说它会有很大的不同,但我不想让它不正确。 ;-) 23 2月. 092009-02-23 00:42:40

  0

非常感谢Tomalak,我检查了你的答案,非常感谢你的帮助。 23 2月. 092009-02-23 00:49:13