2013-10-04 127 views
1

我試圖做出URL規則重寫2.0 我的內部URL是正則表達式 - 網址參數

http://someserver.net/in40/data/getcase.ashx?type=Good&format=json 

(「in40」是一個應用程序)

我需要以下網址工作

http://someserver.net/in40/data/getcase/Good?fmt=json 

規則

<match url="^data/getcase/([_0-9a-z-]+)\?fmt=([_0-9a-z-]+)$" /> 
<action type="Rewrite" url="data/getcase.ashx?type={R:1}&amp;format={R:2}" /> 

不起作用


,但如果我改變\?fmt=/

<match url="^data/getcase/([_0-9a-z-]+)/([_0-9a-z-]+)$" /> 

那麼下面的URL工作正常

http://someserver.net/in40/data/getcase/Good/json 

如何使重寫規則

http://someserver.net/in40/data/getcase/Good?fmt=json 
+0

我不會想你需要'^'給出你匹配的字符串不在字符串的開頭... – James

+0

它是字符串的開始。該URL的基本部分是「http://someserver.net/in40/」。 –

+0

正如我所說的,^ data/getcase /([_ 0-9a-z - ] +)/([_ 0-9a-z - ] +)$工作正常。 (但我試圖刪除^符號:) –

回答

1

的問題是,在[_0-9a-z-]+您正則表達式不允許Good,因爲它與上G開始。一種解決方案是確保路徑的ignoreCase選項已打開。
第二個問題是查詢字符串應該在條件中處理,而不是在路徑中處理。在你的情況下,它會去如下:

<rule name="My rewrite" stopProcessing="true"> 
    <match url="^data/getcase/([_0-9a-z-]+)$" ignoreCase="true" /> 
    <conditions> 
     <add input="{QUERY_STRING}" pattern="^fmt=([_0-9a-z-]+)$" /> 
    </conditions> 
    <action type="Rewrite" url="data/getcase.ashx?type={R:1}&amp;format={C:1}" /> 
</rule> 
+0

謝謝你,「ignoreCase」參數應該在那裏,但它仍然不起作用。它看起來像UrlRewrite 2.0忽略\?部分。因爲當我將其更改爲\。那麼一切順利....... http://someserver.net/in40/data/getcase/Good.fmt=json –

+0

@AndreyLabodin我編輯了我的答案,讓我知道它是否有幫助 – cheesemacfly

+0

謝謝,cheesemacfly: )你的規則定義工作正常。我已經添加了我的解決方案,但我會選擇您的答案。謝謝你的幫助 :) –

0

正則表達式引擎需要在問號前一個反斜槓將其解釋爲文字,而不是可選的量詞,這就是爲什麼你必須逃脫反斜槓本身:\\?該過程稱爲雙轉義。

在C#中編寫正則表達式時,通常在模式字符串前使用@符號,因此不必雙重轉義反斜槓。

1

我以前的規則定義是錯誤的,URL重寫mudule看不到「?」符號,因爲我沒有「條件」部分,我必須包括它。甚至在此之後,我在規則定義中出現了錯誤的「輸入」參數 - {QUERY_STRING}。當模塊「看到」

<add input="{QUERY_STRING}..... 

字符串,則它將搜索{QUERY_STRING}這是URL的一部分權後的「?」符號:) 我已將{QUERY_STRING}替換爲{REQUEST_URI}以匹配整個網址 以下示例適用於我。

<rule name="Boo" stopProcessing="true"> 
    <match url="^(.+)" /> 
    <conditions> 
    <add input="{REQUEST_URI}" pattern="data/getcase/([_0-9A-Za-z-]+)\?fmt=([_0-9A-Za-z-]+)$" ignoreCase="true" /> 
    </conditions> 
    <action type="Rewrite" url="data/getcase.ashx?type={C:1}&amp;format={C:2}" appendQueryString="false" /> 
</rule>