2017-01-16 152 views
1

我有以下網址:IIS重寫URL與extesion清潔URL

https://blog.test.com/search.aspx

和:

https://blog.test.com/post/2017/01/BlogPostNumberOne.aspx

想我要做: 重寫包含單詞post的URL並將aspx最後添加爲一個沒有擴展名的乾淨URL。因此,例如:

https://blog.test.com/search.aspx

- >NO模式匹配,什麼也不做

https://blog.test.com/post/2017/01/BlogPostNumberOne.aspx

- >MATCH,重寫到https://blog.test.com/post/2017/01/BlogPostNumberOne

我試過以下的正則表達式:^(?=.*/post/)(?=.*aspx$)和我的web.config看起來像這樣:

<rule name="Redirect to clean URL" stopProcessing="true"> 
    <match url="^(?=.*/post/)(?=.*aspx$)" ignoreCase="true"/> 
    <action type="Redirect" url="{R:1}"/> 
</rule> 

它不是在所有的工作,有時它返回一個500。你有什麼想法如何正確rewirte我傳入的請求?

THX :)

+0

它不起作用,因爲您只使用零寬度斷言而沒有在「{R:1}」替換中引用的捕獲組。將正則表達式改爲'url =「^(。*/post /.*)\。aspx $」' –

回答

3

它不工作,因爲你只使用零寬度斷言與您在{R:1}更換引用不存在捕獲組。圖案改變爲消耗之一:

url="^((?:.*/)?post/.*)\.aspx$" 
     |    | 
     |--- R : 1 ---| 

參見regex demo

詳細

  • ^ - 串輸入的開始
  • ((?:.*/)?post/.*) - 第1組捕獲的序列:
    • (?:.*/)? - 任選的組匹配比儘可能多直到最後/換行符符號以外的任何字符0+及包括它
    • post/ - 字面字符序列/post/(這樣,字符串輸入應該開始或者與post/或什麼直至幷包括/post/
    • .* - 比換行符符號等儘可能多的
  • \.aspx任何0+字符 - 一個文字字符序列.aspx
  • $ - 字符串輸入結束。
+0

它適用於沒有「post」的URL。但是,當我輸入https://blog.test.com/post/2016/12/23/Blog-Post-Number-One.aspx什麼都沒有發生,它不會重寫它沒有.aspx – G43beli

+1

它必須是什麼字符串的問題輸入被傳遞給正則表達式引擎。試試'url =「^((?:。* /)?post /.*)\。aspx $」'。請注意,正則表達式實際上*要求* post子路徑出現在字符串中。它不能匹配其中沒有'/ part /'的其他URL。 –

+0

工作,你可以更新你的答案?我會用綠色的選中標記來標記它。感謝您的幫助 – G43beli