iis url-rewrite中奇怪的正则表达式错误

时间:2015-07-04 15:24:16

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

这是我的模式:

^(\w{2}-\w{2})/questions(?:/(\w+))?(?:/(\d+))?(?:/.*?)?$

这些是我正在测试的:

en-us/questions/ask
en-us/questions/newest/15
en-us/questions/12/just-a-text-to-be-ignored

它完美无缺,这是演示:

https://regex101.com/r/yC3tI8/1

但是以下重写规则:

<rule name="en-us questions" enabled="true" stopProcessing="true">
  <match url="^(\w{2}-\w{2})/questions(?:/(\w+))?(?:/(\d+))?(?:/.*?)?$" />
  <action type="Rewrite" url="/questions.aspx?lang={R:1}&amp;tab={R:2}&amp;pid={R:3}" />
</rule>  

当我将链接en-us/questions/newest重定向到:/questions.aspx?lang=en-us&tab=&pid=

这有什么问题?它现在大约5个小时我只是回顾相同的事情

2 个答案:

答案 0 :(得分:2)

由于您有三个不同的可能的网址结尾,最终会影响重写网址的结果,您可以设置一个包含所有内容的规则,希望匹配您想要的所有内容,或者您​​可以设置三个规则相应地处理每一个:

一条规则:

^(\w{2}-\w{2})/questions/(\w+)/?(\d+)?.*$
  

https://regex101.com/r/dN8bM9/1 - 尝试处理所有案件

<rule name="en-us questions" enabled="true" stopProcessing="true">
  <match url="^(\w{2}-\w{2})/questions/(\w+)/?(\d+)?.*$" />
  <action type="Rewrite" url="/questions.aspx?lang={R:1}&amp;tab={R:2}&amp;pid={R:3}" />
</rule> 

*注意:原始模式未能捕获第二组的一个可能原因是包含(?:) - 这意味着匹配但不捕获;将其排除可能会解决那里的大部分问题。

三条规则:

^(\w{2}-\w{2})/questions/(\w+)$
  

https://regex101.com/r/lI8bQ1/1 - en-us / questions / [single word]

^(\w{2}-\w{2})/questions/(\d+)/.*$
  

https://regex101.com/r/hV5fK3/1 - en-us / questions / [digits] / discard

^(\w{2}-\w{2})/questions/(\w+)/(\d+)$
  

https://regex101.com/r/kO0dJ0/1 - en-us / questions / [单身   字] / [数字]

将所有内容整合到一个规则集中:

<rule name="en-us questions case one" enabled="true" stopProcessing="true">
  <match url="^(\w{2}-\w{2})/questions/(\w+)$" />
  <action type="Rewrite" url="/questions.aspx?lang={R:1}&amp;tab={R:2}" />
</rule>  
<rule name="en-us questions case two" enabled="true" stopProcessing="true">
  <match url="^(\w{2}-\w{2})/questions/(\d+)/.*$" />
  <action type="Rewrite" url="/questions.aspx?lang={R:1}&amp;tab={R:2}" />
</rule>  
<rule name="en-us questions case three" enabled="true" stopProcessing="true">
  <match url="^(\w{2}-\w{2})/questions/(\w+)/(\d+)$" />
  <action type="Rewrite" url="/questions.aspx?lang={R:1}&amp;tab={R:2}&amp;pid={R:3}" />
</rule>

*注意:您可能需要以某种方式对此进行调整,但它应该让您了解如何容纳三种不同的变体(如您所示)以重写您的网址。 < / p>

答案 1 :(得分:0)

请注意,您有三个懒人捕获:

  1. (?:/(\w+))?
  2. (?:/(\d+))?
  3. (?:/.*?)?
  4. asp.net's regex implementation?解释为:

      

    除了指定给定模式可能恰好发生0或1次之外,?字符还强制模式或子模式匹配最小字符数,当它可能匹配输入字符串中的几个字符时。 / p>

    因此,asp.net不会为 1 分配任何字符,也不会为 2 分配任何字符,并收集其余字符 3 。< / p>

    要使用贪婪匹配而不是懒惰匹配?部队,请使用:{0,1}

    所以你的正则表达式应该是这样的:

    ^(\w{2}-\w{2})/questions(?:/(\w+)){0,1}(?:/(\d+)){0,1}(?:/.*?)?$
    

    Live example