15

我已经阅读了前 30 名 Google 热门歌曲的几种组合IIS rewrite map condition等等,但我在 microsoft.com 网站或其他地方都找不到任何像样的文档。

我在 IIS7 中有一堆重写映射,我想处理它们,而不管它们后面是否有斜杠。所以www.foo.com/barwww.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的答案?提到不能使用正则表达式(引用URL Rewrite Module 中的 Using Rewrite Maps)但是,正如我在那里评论的那样,这似乎与该文本之前给出的具体示例有关,而不是批发“这永远行不通” .

我错过了什么?必须有一些方法可以做到这一点;我错过了一些明显的东西吗?

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>

你非常接近;我只需要做三个小改动:

  • 删除了重写映射中键中的前导斜杠
  • +?在规则的匹配中使用了非贪婪量词
  • {R:1}在条件输入中使用了对匹配项的反向引用

我分享了您在寻找体面文件时遇到困难的经验;在以下文章的帮助下,我不得不尝试自己的方式:

于 2014-03-26T18:04:50.717 回答
0

首先,不要使用点,它匹配一切,自然是贪婪的。改用字符否定:([^\n]+). 试试这个,然后重新运行,如果这不起作用,请尝试/?再次添加该pattern属性。

于 2014-03-26T12:55:22.177 回答