簡體   English   中英

iis url-rewrite 中奇怪的正則表達式錯誤

[英]Weird regex bug in iis url-rewrite

這是我的模式:

^(\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= en-us/questions/newest /questions.aspx?lang=en-us&tab=&pid=

這有什么問題? 現在大約 5 個小時,我只是在回顧同樣的事情

由於您有三種不同的可能 url 結尾,最終會影響重寫 url 的結果,您可以設置一個全包規則,希望能匹配您想要的所有內容,或者您​​可以設置三個規則來相應地處理每個:

一條規則:

^(\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/[單字]

^(\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>

* 注意:您可能需要以某種方式進行調整,但它應該讓您了解如何適應三種不同的變體(如您所見)以重寫您的網址。

請注意,您有三個懶惰的捕獲:

  1. (?:/(\\w+))?
  2. (?:/(\\d+))?
  3. (?:/.*?)?

asp.net 的正則表達式實現解釋? 作為:

除了指定給定模式可能恰好出現 0 次或 1 次之外, ? 當它可能匹配輸入字符串中的多個字符時,字符還會強制模式或子模式匹配最少數量的字符。

因此,asp.net 沒有將字符分配給1 ,沒有字符分配給2 ,並收集其余的字符3

使用貪婪匹配而不是惰性匹配? 強制使用: {0,1}

所以你的正則表達式應該是這樣的:

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

活生生的例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM