0

iis.net から IIS 7.0 の Mod Rewrite を使用していて、リクエストをリダイレクトしたい:

2 つのルールを作成しました。

<rule name="ID">
   <match url="/users/([0-9])" />
   <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
   <match url="/users/([a-z])" ignoreCase="true" />
   <action type="Rewrite" url="/User.aspx?name={R:1}" />
</rule>

テストは iis mmc テスト ダイアログに渡されますが、デバッグ ( http://localhost:9080/example.com/users/1…/users/fooなどの URL ) では行われず、実際の IIS では行われません!

私は何を間違えましたか?

4

2 に答える 2

2

明らかな問題は、現在の正規表現がユーザー名の1文字または1つの数字にしか一致しないことです。複数の文字または数字を一致させるには、括弧内にプラスの数量詞を追加する必要があります。正規表現の数量詞の詳細については、このページを参照してください。「/users/」(IDや名前なし)のようなプレーンなURLとは一致しないことに注意してください。これが意図したものであることを確認してください。

発生しているもう1つの問題は、IISが最初のスラッシュの後の最初の文字から始まる書き換えルールを評価することです。したがって/users/([0-9])、正規表現の評価が行われると、URLが一致しないように見えるため、一致するルールは何にも一致しusers/fooません/users/foo。解決策は^、スラッシュの代わりにパターンの先頭で(「文字列の先頭」を意味する正規表現文字)を使用することです。このような:

<rule name="ID">
    <match url="^users/([0-9]+)" />
    <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
    <match url="^users/([a-z]+)" ignoreCase="true" />
    <action type="Rewrite" url="/Users.aspx?name={R:1}" />
</rule>

Users.aspxこれらのURLの1つを選択し、もう1つをUser.aspx(複数形ではない)選択していることに注意してください。これが意図したものであることを確認してください。

ところで、私がこれらのことを理解した方法は、IISの失敗した要求のトレースを使用して書き換えルールのトラブルシューティングを行うことでした。これにより、これを非常に簡単に診断できました。テストリクエストを作成し、トレースを調べて、各書き換えルールが評価されている場所を見つけることができました(トレースの「PATTERN_MATCH」というセクションにあります。ルールの1つにある特定のPATTERN_MATCHについて、次のように表示されました。

-PATTERN_MATCH
パターン/users/([0-9] +?)
InputURL users / 1 Negate
false
Matched false

最初のスラッシュがないことに注意してください。

于 2010-03-06T12:49:52.253 に答える
1

最初の文字/数字だけでなく、完全な ID/ユーザーと一致させるには、それぞれ<match url="/users/([0-9]+)" />とを使用する必要があります。<match url="/users/([a-z]+)" ignoreCase="true" />しかし、正規表現が 1 桁で失敗した理由がわからないので、別の問題もあるはずです。

2 番目の質問については、完全には理解できていません。フォルダ名とユーザー名の違いをどのように見分けることができますか? フォルダーには常に末尾のスラッシュがありますか?

于 2010-03-06T12:06:48.580 に答える