15

などのいくつかの組み合わせについて、Google の上位 30 件のヒットを読みましたIIS rewrite map conditionが、microsoft.com サイトまたは他の場所で適切なドキュメントを見つけることができません。

IIS7 には、末尾のスラッシュが続くかどうかに関係なく処理したい書き換えマップがたくさんあります。したがってwww.foo.com/bar、 andwww.foo.com/bar/は両方ともルールに一致する必要があります。

<rewrite>
    <rewriteMaps>
        <rewriteMap name="ShortURLs">
            <add key="/terms" value="/en-us/terms-and-conditions/"/>
            <add key="/privacy" value="/en-us/privacy-and-cookies/"/>
            <add key="/buy" value="/en-us/where-to-buy/"/>
        </rewriteMap>
    </rewriteMaps>
    <rules>
        <rule name="Short URL redirects">
            <match url="^/?(.+)/?$" />
            <conditions>
                <add input="{ShortURLs:{REQUEST_URI}}" pattern="(.+)"/>
            </conditions>
            <action type="Redirect" url="{C:1}" appendQueryString="true"/>
        </rule>
    </rules>
</rewrite>

現在、これは完全にうまく機能しますが、書き換えマップの最初のキーを一致させる唯一の方法は/terms/、マップを複製することであり、次のようになります。

<rewriteMap name="ShortURLs">
    <add key="/terms" value="/en-us/terms-and-conditions/"/>
    <add key="/privacy" value="/en-us/privacy-and-cookies/"/>
    <add key="/buy" value="/en-us/where-to-buy/"/>

    <add key="/terms/" value="/en-us/terms-and-conditions/"/>
    <add key="/privacy/" value="/en-us/privacy-and-cookies/"/>
    <add key="/buy/" value="/en-us/where-to-buy/"/>
</rewriteMap>

そもそも正規表現を使用してそれらを照合していることを考えると、これはとてつもなく洗練されていないように思えます。条件入力または条件パターンへの追加/?が機能していないようです。

IIS7 Rewrite Map Regexの回答を見ましたか? 正規表現は使用できないと述べています(Using Rewrite Maps in URL Rewrite Moduleから引用)が、私がそこでコメントしたように、これは大規模な「これは決して機能しない」というよりも、そのテキストの前に示されている特定の例に関連しているようです.

私は何が欠けていますか?これを行うには何らかの手段が必要です。明らかな何かが欠けていますか?

4

2 に答える 2

22

これはそれを行う必要があります:

<rewrite>
    <rewriteMaps>
        <rewriteMap name="ShortURLs">
            <add key="terms" value="/en-us/terms-and-conditions/"/>
            <add key="privacy" value="/en-us/privacy-and-cookies/"/>
            <add key="buy" value="/en-us/where-to-buy/"/>
        </rewriteMap>
    </rewriteMaps>
    <rules>
        <rule name="Short URL redirects">
            <match url="^(.+?)/?$" />
            <conditions>
                <add input="{ShortURLs:{R:1}}" pattern="(.+)" />
            </conditions>
            <action type="Redirect" url="{C:1}" appendQueryString="true"/>
        </rule>
    </rules>
</rewrite>

あなたはとても親しかった。3 つの小さな変更を加えるだけで済みました。

  • 書き換えマップのキーの先頭のスラッシュを削除しました
  • +?ルールの一致で貪欲でない量指定子を使用した
  • {R:1}条件入力で一致への後方参照を使用しました

適切なドキュメントを見つけるのに苦労した経験を共有します。次の記事の助けを借りて、実験を行う必要がありました。

于 2014-03-26T18:04:50.717 に答える
0

まず、ドットを使用しないでください。ドットはすべてに一致し、当然貪欲です。代わりに文字否定を使用してください: ([^\n]+). これを試してから再実行し、それが機能しない場合は/?pattern属性にもう一度追加してみてください。

于 2014-03-26T12:55:22.177 に答える