1

URL Rewrite 2.0 のルールを作成しようとしています。私の内部 URL は

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

(「in40」はアプリです)

機能するには次の URL が必要です

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
4

3 に答える 3

1

以前のルール定義が間違っていたため、URL 書き換えモジュールは「?」を認識できませんでした。「条件」セクションがなく、含める必要があったためです。その後も、ルール定義の「入力」パラメーターが間違っていました-{QUERY_STRING}。モジュールが「見た」とき

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

文字列の場合、「?」の直後の URL の一部である {QUERY_STRING} を検索します。シンボル :) {QUERY_STRING} を {REQUEST_URI} に置き換えて、代わりに URL 全体に一致するようにしました。次の例は私にとってはうまくいきます。

<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>
于 2013-10-13T10:57:56.857 に答える
1

問題は、正規表現がアッパーで始まる[_0-9a-z-]+ため許可されないことです。1 つの解決策は、パスに対してオプションがオンになっていることを確認することです。 2 つ目の問題は、クエリ文字列をパスではなく条件で処理する必要があることです。あなたの場合、次のようになります。GoodGignoreCase

<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>
于 2013-10-04T16:00:28.273 に答える
0

正規表現エンジンは、疑問符をオプションの量指定子ではなくリテラルとして解釈するために、疑問符の前にバックスラッシュを必要とします。そのため、バックスラッシュ自体をエスケープする必要があります。\\?このプロセスは二重エスケープと呼ばれます。

C# で正規表現を記述するときは、通常@、パターン文字列の前に記号を使用するため、バックスラッシュを二重にエスケープする必要はありません。

于 2013-10-07T14:49:01.287 に答える