[英]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}&tab={R:2}&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}&tab={R:2}&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}&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}&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}&tab={R:2}&pid={R:3}" />
</rule>
* 注意:您可能需要以某種方式進行調整,但它應該讓您了解如何適應三種不同的變體(如您所見)以重寫您的網址。
請注意,您有三個懶惰的捕獲:
(?:/(\\w+))?
(?:/(\\d+))?
(?:/.*?)?
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.